【发布时间】:2017-07-11 00:20:10
【问题描述】:
我想用 Sinon stub Promise 做一个测试用例
如果我没有从我的代码中解析,那么测试应该会失败,但目前它正在通过。
var sendMail = function (templateName, recipients, templateParameters, attachments, subject) {
return mailingExternalTemplateModel.findMailingTemplateId(templateName)
.then( (result) => {
var params = {
"FromEmail": nodeMailjet.mailjetFromMail,
"FromName": nodeMailjet.mailjetFromName,
"Subject": subject,
'MJ-TemplateID': result,
'MJ-TemplateLanguage': true,
"Recipients": recipients,
"Vars": {
'username': templateParameters.username,
'hello': i18n.__('email.hello'),
'voucher_details': i18n.__('email.voucher_details'),
'email_footer': i18n.__('email.footer.i_love_my_price')
}
};
if (attachments) {
params.Attachments = attachments;
}
return mailjet
.post("send")
.request(params)
.then((result) => {
return result.body; //***** If i comment here then still test case goes green which should fail. so how i achive that?
});
})
.catch( (err) => {
return Promise.reject(err);
});
};
如果我注释掉 return result.body;,这意味着 Promise 不会返回,测试应该会失败。但它没有发生。
测试用例:
var sinonStubPromise = require('sinon-stub-promise');
sinonStubPromise(sinon);
it('it should send mail successfully', function(done) {
var findMailingTemplateIdStub = sinon.stub(mailingExternalTemplateModel, 'findMailingTemplateId');
findMailingTemplateIdStub.returnsPromise().resolves(88888);
var successResponse = {'successId': 989890};
var request = sinon.stub().returnsPromise().resolves(successResponse);
sinon.stub(mailjet, "post", function () {
return {
request: request
}
});
mailSender.sendMail(templateName, recipients, templateParams, attachments, 'thats subject')
.then((returnVal) => {
assert.deepEqual(
returnVal,
successResponse
);
})
.catch((err) => {
})
done();
});
【问题讨论】:
-
为什么 - 投票?我不明白?这是一个完美的问题...
-
尝试移动 done();在你的断言之后调用 then
-
@wietsevenema 它会给出错误错误:超过 2000 毫秒的超时。对于异步测试和钩子,确保调用“done()”;如果返回 Promise,请确保它已解决。
-
如果你正在测试基于 Promise 的代码,不要使用
done,而是使用 Mocha 的 built-in promise support。此外,您的测试正在吞噬assert.deepEqual()由于空的catch处理程序引发的任何错误。 -
@robertklep 你能回答这个问题吗?提前致谢。
标签: javascript node.js promise mocha.js sinon