Javascript 茉莉花,React&;AJAX:函数中的单元测试函数
下面是我想测试的代码。具体来说,我想监视一个名为Javascript 茉莉花,React&;AJAX:函数中的单元测试函数,javascript,ajax,unit-testing,reactjs,jasmine,Javascript,Ajax,Unit Testing,Reactjs,Jasmine,下面是我想测试的代码。具体来说,我想监视一个名为Linkvalidation.validate的实用程序,以确保在调用handleSave()时调用它 此代码位于一个名为condentedformmodal的组件中: handleSave() { LinkValidation.validate(this.state.url) .then((response) => { if (response.success) { this.setState({
Linkvalidation.validate
的实用程序,以确保在调用handleSave()
时调用它
此代码位于一个名为condentedformmodal
的组件中:
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
};
});
这是我的测试文件--
进口声明:
从'modules/link validation.js'导入{validate}代码>
测试:
descripe('当URL是内部链接时',()=>{
它('显示唯一的错误消息',(完成)=>{
让模态=浅度();
modal.setState({
网址:'https://internal.example.com'
});
设x=jasmine.createSpy('validate')和.returnValue({
消息:“无效的内部链接”,
成功:错,
网址:'https://example.com'
});
modal.handleSave();
_.延迟(()=>{
期望(x).tohavebeincalled();
完成();
});
});
});
当我运行此测试时,它始终失败,并显示消息“Expected spy validate to have called”
在看了Jasmine文档()和其他各种堆栈溢出问题(、等)之后,我无法完成这项工作。我还尝试了callFake
和callThrough
而不是returnValue
关于如何监视链接验证的任何想法。验证以确保它被调用?此行:
let x = jasmine.createSpy('validate')
创建新的spy函数(它不监视现有的validate
函数),而handleSave
函数不知道它。所以根本不叫它。
您必须设置在组件中实际调用的spy-on函数。由于您的condentedformmodal
使用LinkValidation
模块(我假设该模块导入到组件文件中),您必须从组件实际使用的导入模块中设置spy onvalidate
函数。所以我建议如下:
this.LinkValidation.validate(this.state.url);
在condentedformmodal
constructor中,将LinkValidation
设置为组件属性,以便在测试中轻松访问:
this.LinkValidation = LinkValidation;
在handleSave
中使用validate
如下功能:
this.LinkValidation.validate(this.state.url);
最后,在测试集中,监视组件验证方法:
describe('when the URL is an internal link', () => {
it('displays a unique error message', (done) => {
let modal = shallowInstance(<CondensedFormModal />);
...
spyOn(modal.LinkValidation, 'validate').and.returnValue({
message: "invalid internal link",
success: false,
url: 'https://dash.vagrant.local.rf29.net/shopping/new'
});
modal.handleSave();
_.defer(() => {
expect(modal.LinkValidation.validate).toHaveBeenCalled();
done();
});
});
});
descripe('当URL是内部链接时',()=>{
它('显示唯一的错误消息',(完成)=>{
让模态=浅度();
...
spyOn(modal.LinkValidation,'validate')。和.returnValue({
消息:“无效的内部链接”,
成功:错,
网址:'https://dash.vagrant.local.rf29.net/shopping/new'
});
modal.handleSave();
_.延迟(()=>{
expect(modal.LinkValidation.validate).tohavebeencall();
完成();
});
});
});