2

我发现了很多关于这个主题的类似讨论,但不幸的是,它们都不适合我的场景。我正在尝试模拟量角器的后端响应,以测试目前真实 API 中不存在的新功能。我尝试了不同的方法来实现这一目标,但没有运气。每次我运行量角器测试时,都会对真实API执行http请求,而不是拦截请求。

这是我的场景:我有一个 AngularJS 应用程序,并且在一个视图中有一个搜索输入框,如下所示:

<input type="text" class="form-control rounded input-lg" placeholder="Search Contacts" ng-model="contactCtrl.filter" ng-change="contactCtrl.inspectFilter()" focus="true" id="inputSearch">

然后,我有一个控制器:

  function inspectFilter() {
      $q.all([
        comService.indexContacts($rootScope.$user.cloudContacts, vm.filter)
          .then(function(response) {
            vm.contacts = angular.copy(contacts);
          })
          .catch(function() {
          })
      ]).then(function() {
      });
    }
  }

并且comService.indexContacts执行 http 请求:

function indexContacts(url, filter) {
  var filtered_url = filter ? url + '?displayName=' + encodeURIComponent(filter) : url;

  initializeRequest();

  req = {
    headers : {
      'Authorization' : getAuthenticationToken()
    },
    method : 'GET',
    url    : filtered_url
  };

  return $http(req);
}

我不打算解释一切的逻辑,我们只是说,当用户在输入字段中键入内容时,该indexContacts函数会触发对 API 的 GET 请求,并且用户可以在屏幕上看到呈现的联系人列表。

现在我很想在我的量角器测试中拦截那个 $http(req) 并返回一个模拟 JSON,但我不明白如何。

'use strict';

describe('Making a call from the contact detail screen', function() {
  beforeAll(function() {
    contacts.goToContacts();
    element(by.id('inputSearch')).clear().sendKeys('gai');
  });

  describe('UAT1 - Clicking the number to make a call', function() {
    it('Given that the user is on the Cloud contact/user detail screen', function() {
      element(by.repeater('contact in contactCtrl.results').row(0)).element(by.css('.tdName')).click();

      dom.waitForElementDisplayed(element(by.css('.contact-modal')));
    });
...
...

好的,我在这里所做的是将一些文本注入到搜索字段中:element(by.id('inputSearch')).clear().sendKeys('gai');这有效,但是,我想拦截由前一个 comService 触发的 http 请求,而是将模拟 JSON 返回给应用程序以呈现自定义用户列表,而不是为此使用真正的 API。

我怎样才能做到这一点????

4

0 回答 0