我发现了很多关于这个主题的类似讨论,但不幸的是,它们都不适合我的场景。我正在尝试模拟量角器的后端响应,以测试目前真实 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。
我怎样才能做到这一点????