2017-06-22 41 views
0

我有这个函数,它将电子邮件和访问密钥作为参数,并对mailboxlayer api进行网络调用,并返回带有验证结果的承诺。在使用Jest测试JavaScript异步代码时遇到问题JS

function validateEmail(email, accessKey) { 
    return new Promise(function (fulfill, reject) { 
     request.get("http://www.apilayer.net/api/check?access_key=" + 
     accessKey + "&email=" + email + "&smtp=1&format=1") 
      .end(function (err, res) { 
      if (err) { 
       reject(err); 
      } 
      else { 
       fulfill(res.body); 
      } 
     }); 
    }); 
} 

我想测试这一点,所以我创建了一个下面的测试

describe('EmailValidator', function() { 
    it("Should take an email,accessKeys as parameters and return a Promise", 
    function() { 

     const data = { 
      email: "[email protected]", 
      did_you_mean: "", 
      user: "somemail", 
      domain: "gmail.com", 
      format_valid: true, 
      mx_found: true, 
      smtp_check: true, 
      catch_all: null, 
      role: false, 
      disposable: false, 
      free: true, 
      score: 0.8 
     }; 

    obj.validateEmail("[email protected]","80867a1cafc7017cd9a9b510c01d1ba7") 
    .then(value => { 
      expect(data).toEqual(value); 
     }) 
    }); 
}); 

而我得到的结果“试验成功”与下面的屏幕 enter image description here

但随后获取失败的结果,在数据对象中(我用来比较网络调用的结果),我只是将用户值从用户:“somemail”改为用户:“anothermail”。 所以在这里,我期待测试失败,因为我比较的对象与我从网络获得的对象不同。但结果并不如预期,但测试通过一些建议。结果如下图所示 enter image description here

我想知道这里发生了什么,我该如何实现这个功能,就像我期望的那样,即让这个测试失败。

回答

2

问题是您的测试在诺言产生错误之前完成。要使用承诺Jest进行测试,您需要从测试中返回承诺。这样做会使测试等待承诺完成,如果承诺被拒绝,测试将失败。

只需添加一个return语句测试,试试这个 -

return obj.validateEmail("[email protected]","80867a1cafc7017cd9a9b510c01d1ba7") 
.then(value => { 
     expect(data).toEqual(value); 
    }) 
}); 

玩笑文档 -

一定要归还承诺 - 如果你省略此return语句,您的测试将在Promise方法完成之前完成。

+1

你太棒了。谢谢。有效 !!! –