4

我和我的老板之间就Angular E2E 测试进行了热烈的讨论。根据vojitajina 拉取请求,我们需要运行服务器才能运行 e2e 测试。所以,运行e2e测试涉及到一个真实的服务器,一个真实的服务器涉及到DB。这会使测试变慢。好吧,现在的问题是如何在不涉及真实服务器的情况下测试 e2e ?有没有办法使用 httpBackend 和 e2e 角度 API,我可以在其中使用 browser()、element()、select() 进行测试?

4

2 回答 2

5

[参见下面的编辑] 我们使用 shell 脚本定期从我们的种子测试服务器捕获 curl 请求。然后通过 $httpBackend.whenGet(...).respond() 返回这些响应以拦截并返回该数据。

所以,在我们的 index.html

if (document.location.hash === '#test') {
  addScript('/test/lib/angular-mocks.js');
  addScript('/test/e2e/ourTest.js');
  window.fixtures = {};
  addScript('/test/fixtures/tasks/tasks_p1.js');
  // the tasks_p1.js is generated and has "window.fixtures.tasks_p1 = ...json..."
  addScript('/test/fixtures/tasks/tasks_p2.js');
  // the tasks_p2.js is generated and has "window.fixtures.tasks_p2 = ...json..."
  addScript('/test/e2e/tasks/taskMocks.js\'><\/script>');
}

我们的Test.js

angular.module('ourTestApp', ['ngMockE2E','taskMocks']).
    run(function ($httpBackend, taskMocks) {
      $httpBackend.whenGET(/views\/.*/).passThrough();
      $httpBackend.whenGET(/\/fixtures.*\//).passThrough();

      taskMocks.register();

      $httpBackend.whenGET(/.*/).passThrough();
    });

taskMocks.js

/*global angular */
angular.module('taskMocks', ['ngMockE2E']).
  factory('taskMocks', ['$httpBackend', function($httpBackend) {
  'use strict';
  return {
    register: function() {
      $httpBackend.whenGET(..regex_for_url_for_page1..).respond(window.fixtures.tasks_p1);
      $httpBackend.whenGET(..regex_for_url_for_page2..).respond(window.fixtures.tasks_p2);
    }
  };
}]);

在少数情况下,我们的数据与当前日期有关;例如“本周的任务”,所以我们在 register() 方法中处理捕获的数据。

编辑 我们现在使用Rosie为我们的模拟对象创建工厂。因此,对于预期的 json 响应,不再需要 CURLing 测试服务器。index.html 不再加载这些“.js”固定装置,模拟看起来像:

taskMocks.js

/*global angular */
angular.module('taskMocks', ['ngMockE2E']).
  factory('taskMocks', ['$httpBackend', function($httpBackend) {
  'use strict';
  var tasks_p1 = [ Factory.build('task'), Factory.build('task')], 
      tasks_p2 = [ Factory.build('task'), Factory.build('task')] 
  return {
    register: function() {
      $httpBackend.whenGET(..regex_for_url_for_page1..).respond(tasks_p1);
      $httpBackend.whenGET(..regex_for_url_for_page2..).respond(tasks_p2);
    }
  };
}]);
于 2013-01-01T19:34:27.640 回答
-1

要回答您的问题,是的,有一种方法可以在不涉及真实服务器的情况下做到这一点,您可以使用 $httpBackend 在 e2e 测试中模拟响应,但它不像在单元测试中模拟它们那么简单。您还需要在 index.html 中包含 angular-mocks.js 以及在 app.js 中包含“ngMockE2E”。

如何模拟 AJAX 请求?

于 2013-07-31T12:18:39.700 回答