Versuchen zu verstehen, Jasmine toHaveBeenCalled() matcher
Ich bin neu jasmine
hier ist mein src
- Datei, in die ich erstellen Auth
Klasse
function Auth() {
}
Auth.prototype.isEmpty = function(str) {
return (!str || 0 === str.length);
}
Auth.prototype.Login = function (username , password) {
if (this.isEmpty(username) || this.isEmpty(password)) {
return "Username or Password cann't be blank ";
}
else {
return "Logged In !";
}
}
nun will ich testen, jasmine toHaveBeenCalled()
matcher . Hier ist, was ich Schreibe
it("should be able to Login", function () {
spyOn(authobj);
expect(authobj.Login('abc', 'abc')).toHaveBeenCalled();
});
aber Sie sagt, dass undefined() method does not exist
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: Schau basecode Antwort für einen besseren Ansatz
Von den docs, sollten Sie es verwenden, wie die folgenden:
So sollten Sie schreiben:
Error: Expected a spy, but got undefined. in http://localhost:57494/Scripts/Jasmine/jasmine.js (line 1361)
Login
Funktion , dann tut es nennenisEmpty
Funktion oder nicht ? .isEmpty
einen AnrufLogin
ich update meine Antwort.Blick auf deinen use-case, kann ich nicht empfehlen, mit
toHaveBeenCalled
hier.toHaveBeenCalled
ist in Fällen nützlich, wo Sie wollen testen callbacks (async) oder in Kombination mit mocks.Betrachten alles, was geschieht innerhalb
Auth.prototype.Login
als Implementierungsdetail, das nicht sichtbar ist "outerworld". Sie sollten nicht test-Implementierung-details. Was löst zwei Fragen.Warum sollte ich nicht test-Implementierung-details?
Macht es refactoring schwer. Lassen Sie uns sagen, das Sie ersetzen möchten
Auth.prototype.isEmpty
für einige Gründe, die vonunderscore.isEmpty
. Einige Tage später werden Sie entscheiden, Sie zu ersetzenunderscore
vollständig durchlodash
. Dies würde Sie zwingen, sich zu ändern, Ihre test drei mal. Betrachten Sie alles, was verhindert, dass Sie von refactoring leicht als "no-go".Was soll ich das testen statt?
Öffentliche API. Alles, was sichtbar ist, um die "outerworld". Das ist in deinem Fall "Eingeloggt !" und "Benutzername oder Passwort kann nicht leer sein ".
Die Ergebnisse in 3 tests:
Seine einfach zu bedienen, im Grunde:-