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 on
validate
函数。所以我建议如下:

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();
    完成();
    });
    });
    });