我正在尝试使用Protractor的addMockModule()来模拟一个简单的AngularJS模块并覆盖一个变量:
这是我的HTML:
<body ng-app="myApp">
<div ng-controller="myAppController">
Overriden module value <b>{{myValue}}</b>
</div>
<script src="/Scripts/Lib/angular/angular.js"></script>
<script src="/module.js"></script>
<script src="/controller.js"></script>
</body>
这是我的控制器:
var myApp = angular.module("myApp", ['myModule']);
myApp.controller("myAppController", function ($scope, myValue) {
$scope.myValue = myValue;
});
这是我的模块:
var newModule = angular.module('myModule', []);
newModule.value('myValue', "oldValue");
这是我的Jasmine / Protractor代码:
var mockMyModule = function () {
var newModule = angular.module('myModule', []);
newModule.value('myValue', "newMockedValue");
};
it('should override services via mock modules', function () {
ptor = protractor.getInstance();
ptor.ignoreSynchronization = true;
browser.addMockModule('portfolioDataAccessMod', mockMyModule);
browser.get('http://localhost:57627/page1.html');
expect(element(by.binding("myValue")).getText()).toBe("newMockedValue");
});
结果:
故障:
1)/ AssetAllocation / Index中的端到端测试应该覆盖 通过模拟模块的服务消息: 预期'oldValue'为'newMockedValue'。
有什么问题?
到目前为止我找到的所有示例都是覆盖HTTP调用,但我想要的只是使用一个简单的变量来模拟一个非常简单的模块。在Protractor中可以做到吗?
答案 0 :(得分:7)
据Juliemr在这篇文章中所说:
https://github.com/angular/protractor/issues/509
“在mockedModule中运行的代码是在一个单独的运行中运行的 测试的背景。一个在浏览器中,一个在node.js中 进程运行测试“
将mockedValue
的声明置于it()
内并启用角度同步
it('should override services via mock modules', function () {
ptor = protractor.getInstance();
// When ignoreSynchronization is true mocking doesn't work
ptor.ignoreSynchronization = false;
browser.addMockModule('myModule', function () {
var module = angular.module('myModule').config(['$provide', function ($provide) {
$provide.constant('myValue', 'newMockedValue');
}])
});
browser.get('http://localhost:57627/page1.html');
expect(element(by.binding("myValue")).getText()).toBe("newMockedValue");
});