2017-02-21 50 views
0

Я хочу сделать тестовый пример с использованием Sinon заглушки Promiseтестов сделать с помощью Sinon заглушки для функций с помощью Promises

Если я не разрешением от моего кода, то тест должен терпеть неудачу, но в настоящее время она проходит.

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;, что означает обещание не возвращаться, то тест должен потерпеть неудачу. Но этого не происходит.

Тестовый пример:

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(); 
}); 
+0

Почему - голосование? я не понимаю? это идеальный вопрос ... –

+1

Попробуйте переместить done(); вызовите внутри тогда после вашего подтверждения –

+0

@wietsevenema он выдаст ошибку Ошибка: превышен период ожидания 2000 мс. Для асинхронных тестов и перехватчиков убедитесь, что вызывается «done()»; если вы возвращаете обещание, убедитесь, что оно разрешено. –

ответ

1

без проверки с вашим кодом широко, я могу предложить следующее советовать, которые могли бы решить вашу проблему: во-первых, Mocha supports 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 возвращается мокко.

+0

да не требуется здесь, но можете ли вы дать ответ о: если я прокомментирую строку return result.body; , тогда мой тест должен потерпеть неудачу. но в настоящее время проходит тест. –

+0

@ApoorvaShah вы можете проверить, что такое 'returnVal'? Я предполагаю, что это 'undefined', если вы не укажете' return result.body'. – robertklep

+0

Этот стиль тоже довольно сложный. Если вы забудете ввести «возврат», ваш тест всегда будет зеленым. –

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: '[email protected]', 
          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); 
      } 
     ); 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^