Angularjs 使用量角器运行测试时调用其他api

Angularjs 使用量角器运行测试时调用其他api,angularjs,protractor,angularjs-e2e,Angularjs,Protractor,Angularjs E2e,我目前已经使用量角器设置了一些测试。这些测试正在从WebApi检索数据。但是,我想将WebApi调用指向一个真实但模拟的WebApi,它只返回我想用作测试数据的对象 例如,当前请求是: http://localhost/myApp/api/profile/getUser/1 我想操纵此请求,以便测试将使用: http://localhost/myApp/apiMock/profile/getUser/1 首先,我想编写一个拦截器来更改请求头,但我不知道如何使用这个拦截器。我不能在量角器测试中

我目前已经使用量角器设置了一些测试。这些测试正在从WebApi检索数据。但是,我想将WebApi调用指向一个真实但模拟的WebApi,它只返回我想用作测试数据的对象

例如,当前请求是:

http://localhost/myApp/api/profile/getUser/1
我想操纵此请求,以便测试将使用:

http://localhost/myApp/apiMock/profile/getUser/1
首先,我想编写一个拦截器来更改请求头,但我不知道如何使用这个拦截器。我不能在量角器测试中直接使用角度,对吗?如果可以,编写拦截器不是问题,我只是不知道如何在量角器中插入它进行测试

我读过以下文章:但它不能满足我的需求,因为我不想一遍又一遍地调用同一个url,我想替换(部分)动态url以指向模拟api服务


为了让我自己更清楚,我不是在客户端寻找模拟数据。我想保留API调用(我认为它更像E2E),但只需指向另一个返回模拟数据的API url。

通过添加
addMockModule

详情如下:

解决方案:

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');
  }
};
然后我有我的实际测试,我加载模块

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() { 
        // your test that clicks a button that performs a rest api call. 
    });
});

积分转到@gontard

在代码中定义了api url?每个控制器都有自己的服务来处理http调用。在服务内部有一个包含基址('api/profile/')的变量。函数本身(我们在其中调用$http)向url参数添加正确的操作(APIRL+'getuser/'+userid)。基址('api')可以使用
angular.constant
定义,然后注入到您的服务中。在量角器测试中,用模拟地址(“apiMock”)替换基址。谢谢,事实上,这与拦截API调用类似。但是如何改变量角器中的常数呢?每当我调用angular时,它都会说“angular未定义”,您应该使用
ptor.addMockModule