【问题标题】:How to mock angular.module('myModule', []).value() in Jasmine/Protractor如何在 Jasmine/Protractor 中模拟 angular.module('myModule', []).value()
【发布时间】:2014-08-23 22:32:52
【问题描述】:

我正在尝试使用 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/量角器代码:

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 调用,但我想要的只是用一个简单的变量模拟一个非常简单的模块。量角器可以吗?

【问题讨论】:

  • 这背后的想法是为实时环境设置常量,并仅为量角器测试更改它们。

标签: angularjs mocking jasmine protractor angularjs-e2e


【解决方案1】:

根据 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");

});

【讨论】:

  • 不工作是正常的。使用 ptor.ignoreSynchronization = true;您指定您没有测试角度页面。所以没有必要嘲笑。
  • 更多关于 ignoreSynchronization 属性的信息:stackoverflow.com/questions/28808463/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 2017-02-14
相关资源
最近更新 更多