5

Zrobiłem prosty demo fabryki i próbuję przetestować to używając jaśminu. Jestem w stanie uruchomić test, ale używam metody spyOn. Wolałbym używać jasmine.createSpy lub jasmine.createSpyObj, aby wykonać ten sam test. Czy ktoś mógłby mi pomóc w refaktoryzacji mojego kodu, aby zamiast tego używać tych metod w moim przykładzie?Jak działa program createSpy w 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'); 
    }); 
}) 

aktualizacja

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

Co próbujesz osiągnąć? Z wyjątkiem drugiego 'it()', wszystkie pozostałe nie testują żadnego z twojego kodu: po prostu testują, że Jasmine działa jak udokumentowane. –

+0

Próbuję przetestować moją fabrykę .. !! Chcę przetestować moją fabrykę za pomocą Spyona i używając jaśminu. Zgadzam się. – user944513

+0

Jeśli celem jest przetestowanie usługi, nie trzeba tworzyć żadnego kontrolera. Wstrzyknij usługę, wywołaj jej metody i sprawdź, czy robią to, co powinni. Nie potrzebujesz żadnego szpiega, chyba że testowana usługa zależy od innych usług, które chcesz udawać/szpiegować. –

Odpowiedz

0

Jak wspomniano w komentarzach, nie ma absolutnie żadnej potrzeby, aby szpiedzy testowali taką usługę. Gdybyś musiał napisać dokumentację do swojej usługi: powiedziałbyś:

setValue() pozwala na zapisanie wartości. Ta wartość może być następnie odzyskana przez wywołanie getValue().

I to należy sprawdzić:

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); 
    }); 
}); 

Ponadto, usługa nie jest fabryka. Fabryka jest obiektem, który służy do tworzenia rzeczy. Twoja usługa niczego nie tworzy. Jest rejestrowany w module kątowym przy użyciu funkcji fabrycznej. Ale sama usługa nie jest fabryką.

2

Zmieniłem swój plunkr:

spy = jasmine.createSpy('spy'); 

fac.setValue = spy; 

Edycja

W Jaśminie mocks określane są jako szpiedzy. Istnieją dwa sposoby, aby utworzyć szpiega w Jasmine: spyOn() może być używany tylko wtedy, gdy metoda już istnieje na obiekcie, podczas gdy jaśmin.createSpy() zwróci zupełnie nową funkcję.

Znaleziono informacje here. Łącze ma dużo więcej informacji o tworzeniu szpiegów.

+0

co zrobiłeś ... mógłbyś wyjaśnić więcej – user944513

+0

Po prostu tworzę szpiega używając: jaśmin.createSpy. I zastąpił funkcję "setValue" tym szpiegiem. Nie jestem w 100% pewny, ale uważam, że Jasmine robi coś bardzo podobnego przy użyciu metody "spyOn". –

Powiązane problemy