Angular Испытание прототипа e2e
Я пишу сквозной тест, используя Protractor для моего приложения Angular. Я могу издеваться над httpBackend для unit test, но я хочу на самом деле вызвать сервер и вернуть ответ JSON и снова написать тесты возвращенных данных.
Я много читал о stackoverflow, но не могу понять, как это делается.
Я использую $http? Как я ввожу его в свои тесты Жасмин? Как получить ответ JSON на мой тест Jasmine?
любая помощь или ссылки на ресурсы с инструкциями по выполнению этого будут полезны.
Снова я НЕ хочу насмехаться над сервером, я хочу попасть на сервер и вернуть JSON.
Спасибо!
Ответы
Ответ 1
Я работаю над этим сам в данный момент. Короткий ответ, я думаю, заключается в том, что вы настроили приложение точно так же, как если бы вы вручную его тестировали самостоятельно - так что Protractor на самом деле просто пользователь-робот, у него нет (ну, почти нет) доступа к внутренним компонентам вашего приложения.
Итак, если вашему приложению нужен веб-сервер (и большинство из них), тогда вы запускаете этот веб-сервер, а затем транспортир подключаетесь к вашему приложению через браузер и выполняете его.
В моем случае я собираюсь использовать grunt для вызова задачи, которая выполняет базовую настройку базы данных, прежде чем она начнет запускать мои тесты protractor e2e - это должно дать мне известное состояние базы данных.
В качестве примера я написал учебник по использованию Rails 4 с AngularJS, раздел об использовании транспортира для тестирования e2e не является специфичным для рельсов и может быть полезным:
http://technpol.wordpress.com/2013/11/16/5-end-to-end-testing/
Ответ 2
Транспортир должен использоваться для сквозного тестирования вашего полного стека.
В этом случае тест обычно использует приложение angular (заполняющая форму, кнопки нажатия), которая запускает приложение angular для вызова на сервер REST, который возвращает данные, которые преобразует ваше приложение angular в DOM изменения, которые затем подтверждают ваш сквозной тест.
Это означает, что вы, вероятно, захотите запустить сервер приложений (который, как я полагаю, размещает приложение angular и является бэкэнд REST), перед запуском Protractor
Как это сделать, выходит за рамки для Protractor.
Трудность в этом, как правило, заключается в том, как настроить вашу базу данных, чтобы тест e2e знал, чего ожидать в качестве возврата к вашим услугам JSON.
Ответ 3
Ниже приведен пример того, как автоматически запускать и останавливать отдельный сервер node только при запуске тестов e2e. В качестве примера API включен простой экспресс-макет-сервер script.
protractor.conf.js
const {SpecReporter} = require('jasmine-spec-reporter');
const forever = require('forever-monitor');
const child = new (forever.Monitor)('index.js', {
max: 10,
silent: false,
args: ["--port", "3001"],
sourceDir: 'mock-server'
});
let startResolve;
let stopResolve;
const startPromise = new Promise((resolve) => startResolve = resolve);
const stopPromise = new Promise((resolve) => stopResolve = resolve);
child.on('start', function () {
console.info('Forever started mocks.');
startResolve();
});
child.on('restart', function () {
console.info('Forever restarting mocks for ' + child.times + ' time');
});
child.on('exit:code', function (code) {
if (code) {
console.info('Forever exit mocks with code ' + code);
} else {
console.info('Forever exited mocks.');
}
stopResolve();
});
exports.config = {
allScriptsTimeout: 11000,
specs: [
'./e2e/**/*.e2e-spec.ts'
],
capabilities: {
'browserName': 'chrome'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
framework: 'jasmine',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000,
print: function () {
}
},
beforeLaunch: function () {
child.start();
require('ts-node').register({
project: 'e2e/tsconfig.e2e.json'
});
return startPromise;
},
onPrepare() {
jasmine.getEnv().addReporter(new SpecReporter({spec: {displayStacktrace: true}}));
},
onCleanUp() {
child.stop();
return stopPromise;
}
};
ложно-сервер/index.js
// npm install --save express
// npm install --save body-parser
// npm install --save minimist
const express = require('express');
const bodyParser = require('body-parser');
const minimist = require('minimist');
const API_DELAY = 0;
const app = express();
app.use(bodyParser.json({limit: '50mb'}));
// Turn on CORS for browser testing.
app.use(function (req, res, next) {
let accessHeaderInReq = false;
if (req.headers.origin) {
res.header('Access-Control-Allow-Origin', req.headers.origin);
accessHeaderInReq = true;
}
if (req.headers['access-control-request-method']) {
res.header('Access-Control-Allow-Methods', req.headers['access-control-request-method']);
accessHeaderInReq = true;
}
if (req.headers['access-control-request-headers']) {
res.header('Access-Control-Allow-Headers', req.headers['access-control-request-headers']);
accessHeaderInReq = true;
}
if (accessHeaderInReq) {
res.header('Access-Control-Max-Age', 60 * 60 * 24 * 365);
}
// Intercept OPTIONS method for angular preflight checks.
if (accessHeaderInReq && req.method === 'OPTIONS') {
return res.sendStatus(200);
}
else {
next();
}
});
app.get('/api/foo', function (req, res, next) {
console.info('GET - returning foo', req.body);
setTimeout(() => {
res.json({
foo: "bar"
});
}, API_DELAY);
});
const argv = minimist(process.argv.slice(2));
const port = argv.port || 3000;
console.log("Starting express on port", port);
app.listen(port);
В средах с непрерывной интеграцией вы можете установить макет-сервер node_modules без изменения таких каталогов:
npm --prefix ./mock-server install ./mock-server