我目前正在使用Protractor测试AngularJS应用程序,使用browser.addMockModule()
模拟其后端(基于对#125的讨论)并使用$ httpBackend模拟进行E2E测试并附加“数据”模块(myDataModule
)帮助我管理响应(在this.mockLayer
中),将它们保存在另一个文件中。
以下是代码的简化版本:
//here I add the data module
browser.addMockModule('myDataModule', (mockLayer) => {
angular.module('myDataModule', []).value('mockLayer', mockLayer);
}, this.mockLayer);
//then I mock the $httpBackend using the data module
browser.addMockModule('httpBackendMock', () => {
angular.module('httpBackendMock', ['myDataModule'])
.run(['$httpBackend', 'mockLayer', ($httpBackend, mockLayer) => {
$httpBackend.whenGET(/\/api\/v1\.0\/foo\/bar/)
.respond(200, mockLayer.fooBar);
});
let result = mockLayer.dummy( 3, 2 );
// result is expected to be 5, right?
//...
}]);
});
这里是我实例化的MockLayer类并添加为this.mockLayer
:
export class MockLayer {
constructor() {
this.fooBar = {
foo: 'bar'
};
}
dummy( a, b ) {
return a + b;
}
}
这里的问题是,即使mockLayer.fooBar
被找到并且在第二个模块上没有出现问题,也找不到函数mockLayer.dummy()
。我在控制台上得到了这个:
11:33:25.960 WARN - Exception thrown
org.openqa.selenium.WebDriverException: unknown error:
mockLayer.dummy is not a function
API说module.value()
:
使用$ injector注册值服务,例如字符串,数字,数组,对象或函数。
所以我可以使用module.value()
来保存对象或函数。内部函数的对象也应该有效。
另外,我了解测试代码在服务器(量角器)端运行,应用程序代码在客户端运行(在浏览器上有角度)。但我不确定这与这种行为有什么关系。
另一方面,protractor docs说明browser.addMockModule()
:
这将在浏览器上下文中执行,因此它无法访问其范围之外的变量。
但这并不是(据我所知)访问其范围之外的任何变量。
所以...... 我做错了什么?或者这是一个错误还是与量角器如何通过webdriver在浏览器上配置$ httpBackend来发送代码相关的东西?
BTW,我正在使用
值得指出这个问题与this one类似,但它应该在量角器1.8中修复。