如何在Jasmine / Protractor中模拟angular.module('myModule',[])。value()

时间:2014-07-02 23:53:45

标签: angularjs mocking jasmine protractor angularjs-e2e

我正在尝试使用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中可以做到吗?

1 个答案:

答案 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");

});