Ich habe folgende Funktionen:Testing JavaScript Callback-Funktionen mit Jasmin
function getPersonData(id) {
retrieveData(
id,
function(person) {
if(person.name) {
displayPerson(person);
}
}
}
function retrieveData(id, successCallBack) {
executeRequest(id, {
success: successCallBack
});
}
getPersonData
ruft eine Information einer Person auf der ID basiert. Es wiederum ruft retrieveData
auf, indem es die ID und eine Funktion successCallBack übergibt.
retrieveData
nimmt die ID und successCallBack und ruft eine andere Funktion, executeRequest
, die die Daten erhält und ein Objekt Person zurückgibt.
Ich versuche getPersonData
und haben folgende spec
describe("when getPersonData is called with the right person id", function() {
beforeEach(function() {
spyOn(projA.data, "retrieveData").and.returnValue(
{
'name': 'john'
}
);
spyOn(projA.data, "displayPerson");
projA.data.getPersonData("123");
});
it("displays the person's details", function() {
expect(projA.data.displayPerson).toHaveBeenCalled();
);
});
Aber wenn die Spezifikation der displayPerson
Methode aufgerufen wird, wird nicht ausgeführt. Dies liegt daran, dass die Personendaten, die von dem Erfolgsrückruf function(person)
zurückgegeben werden, nicht übergeben werden, obwohl ich retrieveData
verspottet habe, um ein Ergebnis zurückzugeben.
Meine Frage ist: Ist das der richtige Weg, CallBack-Funktionen zu testen? Wie auch immer, was mache ich falsch?
Ich denke, die Verwendung von 'returnValue' für eine Funktion, die keinen Wert zurückgibt, würde nicht funktionieren. Gibt es Alternativen? – user12222
Ich habe mich entschieden, 'Funktion (Person) { zu verschieben, wenn (person.name) { displayPerson (Person); } } 'zu einer neuen Methode, um beim Testen zu helfen. Aber ich würde trotzdem gerne wissen, wie der obige Code getestet werden könnte. – user12222