このトピックについて同様の議論がたくさんありましたが、残念ながら私のシナリオに合うものはありませんでした。現在、実際の API には存在しない新しい機能をテストするために、Protractor からのバックエンド応答をモックしようとしています。それを達成するためにさまざまな方法を試しましたが、うまくいきませんでした。分度器テストを実行するたびに、リクエストをインターセプトする代わりに、実際の API に対して http リクエストが実行されます。
これが私のシナリオです: 私は AngularJS アプリケーションを持っていて、次のような 1 つのビューに検索入力ボックスがあります:
<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 を使用する代わりに、ユーザーのカスタム リスト。
どうやってやるの????