ここではテストしたいコードを示します。具体的には、handleSave()
が呼び出されたときに呼び出されるように、Linkvalidation.validate
というユーティリティを偵察したいと思っています。Jasmine、React&AJAX:関数内のユニットテスト関数
このコードはCondensedFormModal
と呼ばれるコンポーネントに住んでいる:ここ
handleSave() {
LinkValidation.validate(this.state.url)
.then((response) => {
if (response.success) {
this.setState({
message: ''
});
}
})
.fail((error) => {
if (error && error.message && error.message.match(/invalid internal link/)) {
this.setState({
message: 'The URL is an internal link. Please use a public link.'
});
} else {
this.setState({
message: 'The URL is invalid.'
});
}
});
は、私は上記のhandleSave
関数内で使用していLinkValidation.validateユーティリティです:ここで
define([
'module/api-call'
], function(
ApiCall
) {
'use strict';
// Calls validation API
function validate(link) {
var deferred = $.Deferred();
ApiCall.apiCall(
'/url/check',
{ link: link },
'POST',
function(data) {
if (data.success === true) {
deferred.resolve(data);
} else {
// This link is not valid
deferred.reject(data);
}
},
function() {
deferred.reject();
}
);
return deferred;
}
return {
validate: validate
};
});
は私のテストファイルです -
インポートステートメント: import { validate } from 'modules/link-validation.js';
テスト:私はこのテストを実行すると
describe('when the URL is an internal link',() => {
it('displays a unique error message', (done) => {
let modal = shallowInstance(<CondensedFormModal />);
modal.setState({
url: 'https://internal.example.com'
});
let x = jasmine.createSpy('validate').and.returnValue({
message: "invalid internal link",
success: false,
url: 'https://example.com'
});
modal.handleSave();
_.defer(() => {
expect(x).toHaveBeenCalled();
done();
});
});
});
、それは一貫してメッセージで失敗「と呼ばれていることが予想スパイ検証します。」
ジャスミンのドキュメント(https://jasmine.github.io/2.1/introduction)および様々な他のスタックオーバーフローの質問(Unit test with spy is failing. Says spy was never called、Jasmine test case error 'Spy to have been called'、など)を見た後、私はこの作品を作ることができないんです。私もreturnValue
の代わりにcallFake
とcallThrough
を試しました。
LinkValidation.validate
にスパイする方法を教えてください。