Wie Sie mock-Winkel-Dienst, der eine Funktion?
Haben wir eine, was wir nennen eine CORShttpService
, das ist im Grunde ein wrapper um die $http
service, sondern kapselt einige CORS-Funktionalität, die wir brauchen. Ich bin jetzt schriftlich einige tests für einen service, der die CORShttpService
injiziert. Dieser service-code wie dieser:
CORShttpService({method: requestMethod, url: getUrl(path), data: data}).
success(function(data, status, headers) {
//do success stuff
}).
error(function(data, status, headers) {
//do error stuff
});
Will ich verhöhnen, der Aufruf zu CORShttpService
, aber ich bin mir nicht sicher, wie Sie gehen über es zu tun. Ich bin mit Jasmin, und Ihr spyOn
Funktion benötigt ein Objekt zum simulieren der Funktion auf das Objekt. Meine CORShttpService
ist nicht angebracht, der für jedes Objekt, also ich weiß nicht, wie man über die lustig. Ja, ich könnte $httpBackend
zu verspotten, die Anforderungen, die sich schließlich gesetzt in der CORShttpService
, aber ich will nicht, es geht in diesem Dienst in den ersten Platz. Ich möchte zu isolieren, die das Gerät testen und einfach mock externen Anrufe. Gibt es eine Möglichkeit, ich kann mock diesem service ist, dass nur ein Funktion?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als ich dachte, über diese mehr, die
$httpBackend
service bietet eine Menge von Funktionen zum Test Anfragen. Als meineCORShttpService
ist im Grunde ein wrapper um$http
ich beschlossen, ich könnte wahrscheinlich bekommen die die meisten bang für mein Bock, wenn ich die mock-Implementierung vonCORShttpService
einfach die$http
Umsetzung. Mit diese Dokumentation, um mir zu helfen, ich habe Folgendes in meine Skillung:So, alle meine Dienstleistungen wollen den
CORShttpService
gespritzt, jetzt haben im Grunde nur$http
injiziert, und so erlauben Sie mir, nutzen Sie alle$httpBackend
Funktionalität, ohne die Sorge, die extra-Funktionen, die in derCORShttpService
selbst.Dies funktioniert für meinen speziellen Fall, aber so weit, als eine Allgemeine Lösung für Spott Dienste, die nur eine Funktion, die gleiche Art der Sache könnte wahrscheinlich sein getan mit
jasmine.createSpy
wie bereits in zbynour Antwort. So etwas wie:Ja, wie du geschrieben
spyOn
können stub-eine Funktion, aber es muss sein, Eigentum bereits bestehendes Objekt aus. Ich auch damit einverstanden, es ist besser zum isolieren der Einheit. 🙂Was Sie brauchen, ist
jasmine.createSpy
. Durch dass erstellen eines bare spy und definieren Ihr Verhalten wie gewohnt (mitandReturn
,andCallFake
usw.).Ich denke, so etwas wie der code unten (auch mit
jasmine.createSpyObj
) cloud sein, was Sie wollen:In Fall, dass Sie möchten, weiter zu gehen, statt einfach
können Sie speichern die callback übergeben in
später in der spec können Sie rufen Sie die callback zu emulieren den Erfolg Ergebnis aus der
corsHttpService
:Dann ist es möglich zu testen, der Erfolg stuff' von geprüften service...
anotherService(corsHttpService);
. DieCORShttpService
wird automatisch injiziert, in der service, den ich testen möchte. Es gibt keinen Aufruf an den Dienst mit derCORShttpService
als parameter. Ich bin mir nicht sicher, wie man die Injektion der mockCORShttpService
in diesem service, den ich testen möchte.$provide
in meinem spec. Nun habe ich festgestellt das es gut funktioniert, aber nicht in meiner besonderen situation (wenig spezifisch, aber gültig). Ich habedescribe
mitbeforeEach(module(function ($provide) {...
keineit
innerhalb dieserdescribe
einfach nur inneredescribe
mit einigenit
s. In der äußerendescribe
deklarierenvar foo = null
und in der (äußeren)beforeEach
Zuweisung von einem Wert. Diefoo
Wert verwendet wird, init
des innerendescribe
und schlägt es mit "foo
ist null". Das problem ist nur äußerebeforeEach(module(...
. Ohne ihn, D. H.beforeEach(function () {
funktioniert einwandfrei.it
im äußerendescribe
seinebeforeEach
ist nicht genannt. Wenn einigeit
Hinzugefügt, es funktioniert gut, so gut wie ohneit
im äußeren div, aber mit einfach äußerebeforeEach(function() { ...
. Das bedeutet, dass im Falle vonbeforeEach(module(function($provide) { ...
es nicht aufgerufen, wenn keineit
auf aktuelledescribe
block (obwohl normalerweise ist genannt). Bisschen schwierig... 🙂 haben Sie eine Idee, bitte?