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