我发现了很多关于这个主题的类似讨论,但不幸的是,它们都不符合我的情况。 我正在尝试模拟Protractor的后端响应,以测试目前在真实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() {
});
}
}
执行http请求的comService.indexContacts
:
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请求,并且用户可以看到列表在屏幕上呈现的联系人。
现在我想在我的Protractor测试中拦截$ 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。
我该怎么做????