Wie zum Hohn eine Funktion ein Eckiges service in Jasmin
Habe ich die folgenden Winkel-controller
function IndexCtrl($scope, $http, $cookies) {
//get list of resources
$http.get(wtm.apiServer + '/v1/developers/me?access_token=' + $cookies['wtmdevsid']).
success(function(data, status, headers, config) {
//snip
}).
error(function(data, status, headers, config) {
//snip
});
$scope.modal = function() {
//snip
}
return;
}
Was ich versuche zu tun ist, spotten die get-Methode auf den $http-service. Hier mein unit-test-code:
describe('A first test suite', function(){
it("A trivial test", function() {
expect(true).toBe(true);
});
});
describe('Apps', function(){
describe('IndexCtrl', function(){
var scope, ctrl, $httpBackend;
var scope, http, cookies = {wtmdevsid:0};
beforeEach(inject(function($injector, $rootScope, $controller, $http) {
scope = $rootScope.$new();
ctrl = new $controller('IndexCtrl', {$scope: scope, $http: $http, $cookies: cookies});
spyOn($http, 'get');
spyOn(scope, 'modal');
}));
it('should create IndexCtrl', function() {
var quux = scope.modal();
expect(scope.modal).toHaveBeenCalled();
expect($http.get).toHaveBeenCalled();
});
});
});
Wenn ich diese ausführe bekomme ich
ReferenceError: wtm ist nicht definiert.
wtm ist ein globales Objekt und natürlich wäre es nicht definiert werden, wenn ich mit meinen test, weil der code, der es deklariert ist wird nicht ausgeführt, wenn ich mit meinen test. Was ich wissen möchte ist, warum die real $http.get-Funktion aufgerufen wird und wie richte ich ein Spion oder ein stub, so dass ich eigentlich gar nicht nennen, die echte Funktion?
(inb4 hassen auf globals: einer meiner Kollegen ist damit beauftragt worden, mit factoring die aus unser code 🙂 )
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie Draht
whenGET
Methode Ihrer$httpBackend
im Voraus für Ihre test. Versuchen Sie, es bis in diebeforeEach()
- Funktion der test... Es ist ein gutes Beispiel hier unter "Unit-Tests mit Mock-Backend".Schlage ich vor, alle globals gebraucht wird, wie Sie hier beschrieben wird, sollte verwendet werden, durch die
$window
service.Alle globalen Variablen verfügbar sind, wie z.B. Fenster.wtm, wird ebenfalls verfügbar sein auf $Fenster.atm.
Dann können Sie die stub Ihre wtm Referenz vollständig und Spion auf die gleiche Weise, die du bereits beschrieben:
Vielleicht könnte Sie erstellen Sie eine benutzerdefinierte wrapper mock rund $httpBackend, dass Griffe Ihre speziellen Bedürfnisse.
Im detail, Eckig überschreibt Komponenten mit dem gleichen Namen mit einem last-come-first-served " - Strategie bedeutet dies, dass die Reihenfolge, die Sie um Ihre Module zu laden ist wichtig für Ihre tests.
Wenn Sie definieren einen anderen Dienst mit dem gleichen Namen und laden Sie es nach die erste, die Letzte sein wird, sondern injiziert die erste. E. g.:
Dieser service bietet Ihnen die exakt gleiche Schnittstelle und verhält sich genau wie das original, außer dass es nie kommuniziert über jede Steckdose. Dies ist der service, den wir für Tests verwenden möchten.
Mit der load-Sequenz der Winkel im Auge, in den tests dann so Aussehen:
});
Die wichtige Sache hier ist, dass
module('apptasticMock')
wird Sie ausgeführt nachdemmodule('apptastic')
. Dies überschreibt die ursprüngliche socket-Implementierung mit der verspottet man. Der rest ist nur das normale dependency injection-Verfahren.Diesen Artikel schrieb ich interessant für Sie sein könnte, wie es geht in weitere details.