使用Promises使用sinon存根进行测试

时间:2017-02-21 11:38:53

标签: javascript node.js promise mocha sinon

我想使用Sinon stub Promise

创建一个测试用例

如果我没有从我的代码中解析,那么测试应该失败,但目前正在通过。

return result.body;

如果我评论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(); }); ,这意味着Promise不会返回,那么测试应该会失败。但它没有发生。

测试用例:

android.hardware.camera2

2 个答案:

答案 0 :(得分:1)

如果不对您的代码进行广泛测试,我可以提供以下可能解决您问题的建议:首先,Mocha supports promises,当您想要测试基于promises的代码而不是使用done时,它会更好用

此外,如果断言失败(抛出错误),则永远不会处理错误(它被吞下"),部分原因是您添加了空.catch()。这不能通过在断言后添加done来解决,因为它永远不会被调用(因为会抛出错误)。

尝试以下方法:

it('it should send mail successfully', function() {
  ...
  return mailSender.sendMail(templateName, recipients, templateParams, attachments, 'thats subject')
         .then((returnVal) => {
           assert.deepEqual(
             returnVal,
             successResponse
           );
         });
});

注意done以后是如何使用的,而mailSender.sendMail返回的承诺将返回给Mocha。

答案 1 :(得分:1)

现在我将代码更改为关注及其工作。

主要变化是

findMailingTemplateIdStub.returnsPromise().resolves(88888); change to
findMailingTemplateIdStub.returns(Promise.resolve(88888));

var request = sinon.stub().returnsPromise().resolves(successResponse);
changed to var request = sinon.stub().returns(Promise.resolve(successResponse));

   it('it should send mail successfully', function(done) {

    var findMailingTemplateIdStub = sinon.stub(mailingExternalTemplateModel, 'findMailingTemplateId');

    findMailingTemplateIdStub.returns(Promise.resolve(88888));

    var successResponse = {
        'body': {
                    Sent:
                    [
                      {
                          Email: 'test@example.com',
                          MessageID: '188589580585481212'
                      }
                    ]
                }
    };

    var request = sinon.stub().returns(Promise.resolve(successResponse));

    sinon.stub(mailjet, "post", function () {
        return {
            request: request
        }
    });

    mailSender.sendMail(templateName, recipients, templateParams, attachments, 'thats subject')
        .then((returnVal) => {
            assert.deepEqual(returnVal, successResponse.body);
            done();
        })
        .catch((err) => {
                done(err);
            }
        );
});