使用Jest JS在JavaScript中测试异步代码时遇到问题

时间:2017-06-22 08:06:08

标签: javascript node.js jestjs

我有这个功能,它接收电子邮件并访问Key作为参数并对mailboxlayer api进行网络调用,并返回带有验证结果的promise。

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: "somemail@gmail.com",
           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("somemail@gmail.com","80867a1cafc7017cd9a9b510c01d1ba7")
     .then(value => {
           expect(data).toEqual(value);
       })
   });
});

我得到的结果"成功的测试"使用以下屏幕 enter image description here

但是为了得到失败的结果,在数据对象中(我用来与网络调用得到的结果进行比较),我只是从用户改变了用户值:&# 34; somemail" 用户:" anothermail" 。 所以我希望测试失败,因为我比较的对象与我从网络获得的对象不同。但结果并不像预期的那样,但测试通过了一些建议。结果如下图所示 enter image description here

我想知道这里发生了什么,我怎么能按照我的预期来实现这个目标,即让这个测试失败。

1 个答案:

答案 0 :(得分:2)

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

只需在测试中添加return obj.validateEmail("somemail@gmail.com","80867a1cafc7017cd9a9b510c01d1ba7") .then(value => { expect(data).toEqual(value); }) }); 语句,试试这个 -

{{1}}

来自 Jest 文档 -

  

请务必返回承诺 - 如果省略此return语句,您的测试将在Promise方法完成之前完成。