使用Protractor运行测试时调用其他api

时间:2014-06-16 13:22:40

标签: angularjs protractor angularjs-e2e

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

例如,当前请求是:

http://localhost/myApp/api/profile/getUser/1

我想操纵这个请求,所以测试将使用:

http://localhost/myApp/apiMock/profile/getUser/1

首先,我想写一个更改请求标题的拦截器,但我不知道如何使用Protractor进行此操作。我不能在量角器测试中直接使用角度,是吗?如果可以的话,编写拦截器并不是一个问题,我只是不知道如何插入它以进行量角器中的测试。

我已阅读以下帖子:E2E and Mocking但它并不能满足我的需求,因为我不想一遍又一遍地调用相同的网址,我想要更换(动态网址的一部分)指向模拟的api服务。

为了让自己更清楚,我不是在客户端寻找模拟数据。我希望保留API调用(在我看来它更多的是E2E),但只是指向另一个返回模拟数据的API网址。

1 个答案:

答案 0 :(得分:1)

可以通过添加addMockModule

来解决问题

更多详细信息:Protractor addMockModule and $httpProvider interceptor

溶液:

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