使用'addMockModule'在一个测试中添加多个模拟模块



我正在用Protractor模拟Angular网站上的一些端点,使用以下模式:

// mock.js
// adding the mock module and passing it data
Mock.prototype.all = {
    default: function() {
      browser.addMockModule('httpBackendMock', mockModules.all, {
        data: data
      })
    }
}
// mockmodules.js
// add dependencies to module and inject it
exports.all = function() {
    $httpBackend.whenGET(/user/).respond(function() {
        return [200, data.mockData.data];
    });    
    $httpBackend.whenGET(/.*/).passThrough();
    $httpBackend.whenPOST(/.*/).passThrough();
    angular.module('httpBackendMock' ['ngMockE2E', 'sportsbook-app'])
        .value('data', {
            'mockData': arguments[0],
            'count': 0
        })
        .run(runBlock);
        runBlock.$inject = ['$httpBackend', 'data', 'eventDataSourceManager'];  
}
// test-spec.js
// call mock from test
it("Mock", function() {
    mock.all.default();
});

现在这工作得很好,但我希望能够添加更多的模块通过有多个模块,所有发送不同的数据。例子:

Mock.prototype.all = {
    default: function() {
      browser.addMockModule('httpBackendMock', mockModules.allDefault, {
        data: data
      })
    },
    user: function() {
      browser.addMockModule('user', mockModules.allUser, {
        userData: userData
      })
    }
}
it("Mock", function() {
    mock.all.default();
    mock.all.user();
});

像这样,没有一个mock可以工作。

也在selenium服务器中,我可以看到两个模块的名称正在被发现:

Executing: [execute script: angular.resumeBootstrap(arguments[0]);, [[protractorBaseModule_, httpBackendMock, user]]])

一开始我以为问题出在

$httpBackend.whenGET(/.*/).passThrough();
$httpBackend.whenPOST(/.*/).passThrough();

尝试将此添加到单独的模块并在调用所有其他模块后调用它,但仍然不起作用。什么好主意吗?

这是预期的工作,因为您的两个模拟模块使用相同的模块名称标识符httpBackendMock。您可以使用唯一的名称,然后最新的模块将不会覆盖其他模块。

最新更新