我有这个功能,它接收电子邮件并访问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);
})
});
});
但是为了得到失败的结果,在数据对象中(我用来与网络调用得到的结果进行比较),我只是从用户改变了用户值:&# 34; somemail" 到用户:" anothermail" 。 所以我希望测试失败,因为我比较的对象与我从网络获得的对象不同。但结果并不像预期的那样,但测试通过了一些建议。结果如下图所示
我想知道这里发生了什么,我怎么能按照我的预期来实现这个目标,即让这个测试失败。
答案 0 :(得分:2)
问题是您的测试在promise产生错误之前完成。要使用promises在 Jest 中进行测试,您需要从测试中返回promise。这样做会使测试等到承诺完成,如果承诺被拒绝,测试将失败。
只需在测试中添加return obj.validateEmail("somemail@gmail.com","80867a1cafc7017cd9a9b510c01d1ba7")
.then(value => {
expect(data).toEqual(value);
})
});
语句,试试这个 -
{{1}}
来自 Jest 文档 -
请务必返回承诺 - 如果省略此return语句,您的测试将在Promise方法完成之前完成。