Angularjs 使用模拟httpBackend进行角度E2E测试?

Angularjs 使用模拟httpBackend进行角度E2E测试?,angularjs,karma-runner,Angularjs,Karma Runner,我和我的老板就我们需要运行服务器才能运行e2e测试这一问题展开了激烈的讨论。所以,运行e2e测试需要一个真正的服务器,一个真正的服务器需要DB。这使得测试很慢。好吧,现在的问题是如何在不涉及真正服务器的情况下测试e2e?有没有办法使用httpBackend和e2e angular API,在那里我可以使用browser()、element()、select()进行测试 [参见下面的编辑]我们使用shell脚本定期捕获来自种子测试服务器的curl请求。然后通过$httpBackend.whenGe

我和我的老板就我们需要运行服务器才能运行e2e测试这一问题展开了激烈的讨论。所以,运行e2e测试需要一个真正的服务器,一个真正的服务器需要DB。这使得测试很慢。好吧,现在的问题是如何在不涉及真正服务器的情况下测试e2e?有没有办法使用httpBackend和e2e angular API,在那里我可以使用browser()、element()、select()进行测试

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

因此,在我们的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>');
}
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);
    }
  };
}]);
/*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);
    }
  };
}]);
在少数情况下,我们的数据与当前日期相关;e、 g.“本周的任务”,因此我们在register()方法中处理捕获的数据

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

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);
    }
  };
}]);
/*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);
    }
  };
}]);

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


对不起,我什么都不懂。什么是“curl请求”,你说的种子测试服务器是什么意思?对不起,我试着给你足够的资源让你度过难关。curl是一个用于发出web请求的命令行工具。这个设置是否适用于karma?另外,“ourTestApp”是您的应用程序的名称还是单独的测试应用程序的名称,如下面的答案所示?@wakandan it works w/karma,“ourTestApp”是我们单独的测试应用程序模块的名称。如果您要投反对票,请说明原因。问题是“如何在不涉及实际服务器的情况下测试e2e?有没有一种方法可以使用httpBackend和e2e angular API,在那里我可以使用browser()、element()、select()进行测试?”我相信我已经回答了这个问题!这就是我做这件事的方式,也是我做这件事的方式——所以这是我的一个决定