2017-02-21 1 views
0

verwenden möchte ichMake Test sinon Stub für die Funktion mit Promises

einen Testfall mit Sinon Stub Versprechen machen, wenn ich nicht von meinem Code zu lösen bin dann sollte Test nicht bestehen, aber zur Zeit ist es vorbei.

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); 
    }); 
}; 

Wenn ich return result.body; Kommentar aus, die die Versprechen bedeuten nicht zurückkehren, sollte der Test nicht bestehen. Aber es passiert nicht.

Testfall:

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

Warum - Abstimmung? ich kann es nicht verstehen? Das ist eine perfekte Frage ... –

+1

Versuchen Sie, die Done(); Rufen Sie innerhalb der dann nach Ihrer Bestätigung –

+0

@wietsevenema wird es Fehler geben Fehler: Timeout von 2000ms überschritten. Stellen Sie für asynchrone Tests und Hooks sicher, dass "done()" aufgerufen wird. Wenn Sie eine Versprechung zurückgeben, stellen Sie sicher, dass sie verrechnet wird. –

Antwort

1

Ohne ausgiebig mit Ihrem Code zu testen, kann ich die folgenden Ratschläge bieten, die Ihr Problem lösen könnte: Erstens Mocha supports promises, die viel besser funktioniert, wenn Sie testen möchten Versprechen-basierten Code als mit done.

Auch wenn die Assertion fehlschlägt (was einen Fehler auslöst), wird der Fehler nie behandelt (es ist "geschluckt"), teilweise weil Sie eine leere .catch() hinzugefügt haben. Dies kann nicht gelöst werden, indem nach der Assertion done hinzugefügt wird, weil es nie aufgerufen wird (wegen des Fehlers, der ausgelöst wird).

Versuchen Sie Folgendes:

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

Beachten Sie, wie done haupt nicht mehr verwendet wird, und stattdessen die von mailSender.sendMail zurück Versprechen an Mocha zurückgegeben.

+0

ja done ist hier nicht erforderlich, aber können Sie bitte eine Antwort geben über: Wenn ich Zeile kommentieren zurück result.body; dann sollte mein Test fehlschlagen. aber zur Zeit ist der Test bestanden. –

+0

@ApoorvaShah können Sie überprüfen, was 'returnVal' ist? Ich nehme an, es ist "undefiniert", wenn Sie "return result.body" weglassen. – robertklep

+0

Dieser Stil ist auch etwas schwierig. Wenn Sie vergessen haben, "return" einzugeben, wird Ihr Test immer grün sein. –

1

Jetzt habe ich meinen Code zu folgenden und seiner Arbeit geändert.

große Veränderung ist

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

und

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); 
      } 
     ); 
});