Angularjs 量角器addMockModule和$httpProvider拦截器

Angularjs 量角器addMockModule和$httpProvider拦截器,angularjs,protractor,angularjs-e2e,Angularjs,Protractor,Angularjs E2e,这个问题是我的另一个问题的可能解决方案(他们建议使用量角器中的addMockModule): 我有以下文件:mockedRest.js这是我想添加到量角器的模块。它应该拦截任何REST调用并替换地址(api/to-apiMock/) 然后我有我的实际测试,我加载模块 describe('E2E addMockModule', function() { beforeEach(function() { var mockModule = require('./mockedRes

这个问题是我的另一个问题的可能解决方案(他们建议使用量角器中的
addMockModule
):

我有以下文件:
mockedRest.js
这是我想添加到量角器的模块。它应该拦截任何REST调用并替换地址(api/to-apiMock/)

然后我有我的实际测试,我加载模块

describe('E2E addMockModule', function() {
    beforeEach(function() {
        var mockModule = require('./mockedRest');
        browser.addMockModule('apiMockModule', mockModule.apiMockModule);
        console.log('apiMockModule loaded');
        browser.get('#page');
    });
    it('tests the new apiMock', function() { 
        // test that clicks a button that performs a rest api call. left out as I can see the call in fiddler.
    });
});
但是,REST调用仍然指向“api/”而不是“apiMock/” 我不知道我是否需要做更多的事情来让拦截器完成它的工作。 还值得注意的是,apiMockModule内部没有任何登录到console的内容,就像它没有加载模块一样

describe('E2E addMockModule', function() {
    beforeEach(function() {
        var mockModule = require('./mockedRest');
        browser.addMockModule('apiMockModule', mockModule.apiMockModule);
        console.log('apiMockModule loaded');
        browser.get('#page');
    });
    it('tests the new apiMock', function() { 
        // test that clicks a button that performs a rest api call. left out as I can see the call in fiddler.
    });
});

非常感谢您的建议。

我在模拟模块中做了两个小错误修复,以使其正常工作

  • 模拟模块不需要依赖于您的应用程序
  • config.url必须由转换后的设置
更新的
mockedRest.js

exports.apiMockModule = function () {

  console.log('apiMockModule executing');

  var serviceId = 'mockedApiInterceptor';
  angular.module('apiMockModule', [])
      .config(['$httpProvider', configApiMock])
      .factory(serviceId,
      [mockedApiInterceptor]);

  function mockedApiInterceptor() {
      return {
          request: function (config) {
              console.log('apiMockModule intercepted');
              if ((config.url.indexOf('api')) > -1) {
                config.url = config.url.replace('api/', 'apiMock/');
              }

              return config;
          },
          response: function (response) {
              return response
          }
      };
  }

  function configApiMock($httpProvider) {
      $httpProvider.interceptors.push('mockedApiInterceptor');
  }
};
我已在此环境中测试了此代码:

  • 量角器0.24.1
  • 角度1.2.16
  • ChromeDriver 2.10.267517
  • 谷歌浏览器35.0.1916.153
  • Mac OS X 10.9.3 x86_64

你写道:

APIMock模块内没有任何记录到控制台的内容

这是正常的,模块代码不是由量角器执行的,而是发送到浏览器(使用)。因此,代码由浏览器执行

但是,可以为调试设置以下选项:

...
it('tests the new apiMock', function() {
  browser.manage().logs().get('browser').then(function(browserLog) {
    console.log('log: ' + require('util').inspect(browserLog));
  });
...

感谢您的澄清和错误修复,但它仍然不起作用。有没有其他方法可以调试这个?即使我设置config.url='something',它也没有使用该值,我已经完成了我的答案。我已经标记为答案。我的代码可能有问题,但我找不到。拦截器永远不会发射。您是否仍将测试代码作为一个小应用程序?你用什么型号的量角器?非常感谢你的努力和帮助!没问题,我想让你解决你的问题。我仍然有这个测试代码,但我的应用程序(不是很小)…我在测试环境中完成我的答案。