2017-02-21 4 views
0

を使用して機能するためにsinonスタブを使用してテストを行います。私は自分のコードから解決するわけではない場合、テストは失敗するはずですが、現在はそれが通過しているSinonスタブの約束に</p> <p>を使用してテストケースを作成したいの約束

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それはエラーを与えるでしょうエラー:2000msのタイムアウトを超えました。非同期テストとフックでは、 "done()"が呼び出されていることを確認してください。プロミスを返す場合は、それが解決することを確認してください。 –

答えて

1

広範囲にあなたのコードをテストすることなく、私はあなたの問題を解決する可能性があります、以下のアドバイスを提供することができます:まず、Mocha supports promises、あなたが約束ベースのコードをテストしたいときくらい良い作品doneを使用するよりも。

また、アサーションが失敗した場合(エラーをスローする)、エラーは処理されません(「飲み込まれました」)。これは、空の文字列.catch()が追加されたためです。これはアサーションの後にdoneを追加することで解決することはできません。なぜなら、(エラーがスローされるため)呼び出されることはないからです。

次のことを試してみてください。もう一切使用せず、代わりにmailSender.sendMailによって返された約束がモカに返されるかdone

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

注意してください。

+0

はいここでは必要ありませんが、あなたは約回答をお願いします: 私はコメント行の場合 return result.body; 私のテストは失敗するはずです。現在テストは合格です。 –

+0

@ApoorvaShahあなたは 'returnVal'が何であるかチェックできますか? 'return result.body'を省略すると' undefined'と仮定します。 – 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); 
      } 
     ); 
}); 
関連する問題