5

Ich machte eine einfache Demo einer Fabrik und ich versuche, dies unter Verwendung Jasmin zu testen. Ich bin in der Lage, den Test zu starten, aber ich verwende die spyOn Methode. Ich würde lieber jasmine.createSpy oder jasmine.createSpyObj verwenden, um den gleichen Test zu machen. Könnte jemand mir helfen, meinen Code umzuformen, so dass diese Methoden stattdessen in meinem Beispiel verwendet werden?Wie funktioniert der createSpy in Angular + Jasmine?

http://plnkr.co/edit/zdfYdtWbnQz22nEbl6V8?p=preview

describe('value check',function(){ 
    var $scope, 
    ctrl, 
    fac; 
    beforeEach(function(){ 
    module('app'); 

    }); 

beforeEach(inject(function($rootScope,$controller,appfactory) { 
    $scope = $rootScope.$new(); 
    ctrl = $controller('cntrl', {$scope: $scope}); 
    fac=appfactory; 
    spyOn(fac, 'setValue'); 
    fac.setValue('test abc'); 
})); 


    it('test true value',function(){ 
    expect(true).toBeTruthy() 
    }) 

    it('check message value',function(){ 
    expect($scope.message).toEqual(fac.getValue()) 
    }) 

    it("tracks that the spy was called", function() { 
    expect(fac.setValue).toHaveBeenCalled(); 
    }); 

    it("tracks all the arguments of its calls", function() { 
    expect(fac.setValue).toHaveBeenCalledWith('test abc'); 
    }); 
}) 

Update

angular.module('app',[]).factory('appfactory',function(){ 
    var data; 
    var obj={}; 
    obj.getValue=getValue; 
    obj.setValue=setValue; 

    return obj; 

    function getValue(){ 
    return data; 
    } 

    function setValue(datavalue){ 
    data=datavalue; 
    } 

}).controller('cntrl',function($scope,appfactory){ 
    appfactory.setValue('test abc'); 
    $scope.message=appfactory.getValue() 
}) 
+0

Was versuchen Sie zu erreichen? Außer dem zweiten 'it()' testen alle anderen Ihren Code nicht: Sie testen nur, dass Jasmine wie dokumentiert funktioniert. –

+0

Ich versuche meine Fabrik zu testen .. !! Ich möchte meine Fabrik mit Spyon testen und jasmine.creatspy verwenden – user944513

+0

Wenn das Ziel ist, den Dienst zu testen, müssen Sie keinen Controller erstellen. Inject den Dienst, rufen Sie seine Methoden auf und überprüfen Sie, dass sie tun, was sie tun sollen. Sie brauchen keinen Spion, es sei denn, der Dienst, den Sie testen, hängt von anderen Diensten ab, die Sie spionieren/spionieren möchten. –

Antwort

0

Wie in den Kommentaren gesagt, brauchen Sie keine Spione, um einen solchen Dienst zu testen. Wenn Sie die Dokumentation für Ihren Service schreiben müssten: Sie würden sagen:

setValue() ermöglicht das Speichern eines Wertes. Dieser Wert kann dann durch Aufruf von getValue() abgerufen werden.

Und das ist, was sollten Sie testen:

describe('appfactory service',function(){ 
    var appfactory; 

    beforeEach(module('app')); 

    beforeEach(inject(function(_appfactory_) { 
    appfactory = _appfactory_; 
    })); 

    it('should store a value and give it back',function() { 
    var value = 'foo'; 
    appfactory.setValue(value); 
    expect(appfactory.getValue()).toBe(value); 
    }); 
}); 

Auch Ihr Service nicht eine Fabrik. Eine Fabrik ist ein Objekt, mit dem Dinge erschaffen werden. Dein Dienst erstellt nichts. Es ist im Winkelmodul mit einer Werksfunktion registriert. Aber der Dienst selbst ist keine Fabrik.

2

Ich habe Ihre plunkr geändert:

spy = jasmine.createSpy('spy'); 

fac.setValue = spy; 

bearbeiten

In Jasmine werden Mocks als Spione bezeichnet. Es gibt zwei Möglichkeiten, einen Spion in Jasmine zu erstellen: spyOn() kann nur verwendet werden, wenn die Methode bereits auf dem Objekt existiert, während jasmine.createSpy() eine brandneue Funktion zurückgibt.

Gefunden die Information here. Der Link enthält viele weitere Informationen zum Erstellen von Spionen.

+0

was du getan hast ... könntest du mehr erklären – user944513

+0

Ich erstelle einfach einen Spion mit: jasmine.createSpy. Und ersetzte die Funktion 'setValue' durch diesen Spion. Ich bin mir nicht 100% ig sicher, aber ich glaube, dass Jasmine etwas sehr Ähnliches macht, wenn man die "SpyOn" -Methode verwendet. –

Verwandte Themen