2016-11-10 3 views
2

Ich bin ziemlich neu in Chai, damit ich immer noch in den Griff zu bekommen bin.Chai - erwarte Funktion, um Fehler zu werfen

Ich habe eine Funktion geschrieben, die eine API-Antwort überprüft und entweder die richtige Nachricht zurückgibt oder einen Fehler auslöst.

networkDataHelper.prototype.formatPostcodeStatus = function(postcodeStatus) { 

if (postcodeStatus.hasOwnProperty("errorCode")) { 
    //errorCode should always be "INVALID_POSTCODE" 
    throw Error(postcodeStatus.errorCode); 
} 

if (postcodeStatus.hasOwnProperty("lori")) { 
    return "There appears to be a problem in your area. " + postcodeStatus.lori.message; 
} 

else if (postcodeStatus.maintenance !== null) { 
    return postcodeStatus.maintenance.bodytext; 
} 

else { 
    return "There are currently no outages in your area."; 
} 
}; 

Ich habe es geschafft, Tests für das Messaging zu schreiben, jedoch habe ich mit dem Fehlertest zu kämpfen. Hier ist, was ich bisher geschrieben habe:

var networkDataHelper = require('../network_data_helper.js'); 

describe('networkDataHelper', function() { 
var subject = new networkDataHelper(); 
var postcode; 

    describe('#formatPostcodeStatus', function() { 
     var status = { 
      "locationValue":"SL66DY", 
      "error":false, 
      "maintenance":null, 
     }; 

     context('a request with an incorrect postcode', function() { 
      it('throws an error', function() { 
       status.errorCode = "INVALID_POSTCODE"; 
       expect(subject.formatPostcodeStatus(status)).to.throw(Error); 
      }); 
     }); 
    }); 
}); 

Wenn ich den Test oben laufen, bekomme ich folgende Fehlermeldung:

1) networkDataHelper #formatPostcodeStatus a request with an incorrect postcode throws an error: Error: INVALID_POSTCODE

Es scheint, wie der Fehler, die ausgelöst wird, verursacht den Test zu versagen, aber ich bin mir nicht sicher. Hat jemand irgendwelche Ideen?

Antwort

4

Mit dem Vorbehalt, dass ich kein Experte bin Chai, das Konstrukt Sie haben:

expect(subject.formatPostcodeStatus(status)).to.throw(Error); 

kann möglicherweise nicht geworfen Ausnahme behandeln, bevor der Chai Rahmen wird um Ihre .to.throw() Kette zu sehen. Der Code über ruft die Funktion auf, bevor der Anruf zu expect() gemacht wird, so geschieht die Ausnahme zu früh.

Stattdessen sollten Sie eine Funktion expect() passieren:

expect(function() { subject.formatPostCodeStatus(status); }) 
    .to.throw(Error); 

Auf diese Weise kann der Rahmen die Funktion aufrufen nach es für die Ausnahme vorbereitet wird.

+0

Natürlich! Alles funktioniert wie erwartet. Vielen Dank für die informative Antwort und das Code-Snippet. Ich verstehe, warum das Problem aufgetreten ist und Ihre Lösung einwandfrei funktioniert. – tombraider

Verwandte Themen