我正在使用Protractor构建Angular应用程序的E2E测试。后端HTTP服务正在使用$httpBackend
进行模拟。到目前为止,测试看起来像这样:
describe('foo', function () {
it('bar', function () {
var backendMockModule = function () {
angular
.module('backendMock', [])
.run(['$httpBackend', function ($httpBackend) {
$httpBackend.whenPUT('http://localhost:8080/services/foo/bar')
.respond(function (method, url, data, header) {
return [200, {}, {}];
});
}]);
};
browser.addMockModule('backendMock', backendMockModule);
browser.get('http://localhost:8001/#/foo/bar');
element(by.id('baz')).click();
// here I would like to assert that the Angular app issued a PUT to '/foo/bar' with data = {...}
});
});
测试比这更精细,它测试接口和其他东西的乐观更新。但我认为这与这个问题无关,所以我删除了其他部分。测试本身工作正常,我能够检查接口上的元素是否符合预期。我没有发现的是:
如何断言已使用正确的数据,方法,标题等调用后端HTTP端点?
我试过这样做(添加hasBeenCalled
变量):
describe('foo', function () {
it('bar', function () {
var hasBeenCalled = false;
var backendMockModule = function () {
angular
.module('backendMock', [])
.run(['$httpBackend', function ($httpBackend) {
$httpBackend.whenPUT('http://localhost:8080/services/foo/bar')
.respond(function (method, url, data, header) {
hasBeenCalled = true;
return [200, {}, {}];
});
}]);
};
browser.addMockModule('backendMock', backendMockModule);
browser.get('http://localhost:8001/#/foo/bar');
element(by.id('baz')).click();
expect(hasBeenCalled).toBeTruthy();
});
});
但它不起作用。我不确切地知道Protractor如何进行测试,但我想它会在调用addMockModule
中向浏览器发送该函数的序列化版本,而不是在与Web相同的过程中运行测试页面,所以我无法在测试和浏览器之间共享状态(附带问题:这是正确的吗?)。
答案 0 :(得分:0)
$httpBackend.flush()