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