2015-11-01 17 views
5

Jak wyśmiewać prosty Fabryka w AngularJs, który zwraca statyczne dane w jednostce test Karma?Angularjs przetestować proste fabryki, które zwracają dane statyczne

Mam ten prosty zakład, że przez wzgląd na przykład zwrócić dane statyczne:

angular.module('conciergeApp.services') 
     .factory('CurrentUser', function() { 
     return { 
      id: 1, 
      hotel_id: 1, 
     } 
     }); 

Chciałbym wiedzieć, jak napisać Karma test na to?

tej pory mam tego kodu, ale id nie działa:

describe('ReplyCtrl', function() { 

    beforeEach(module('conciergeApp')); 

    beforeEach(module(function($provide) { 
     $provide.service('CurrentUser', function() { 
      return 1; 
     }); 
    })); 

    //Getting reference of the mocked service 
    var mockUtilSvc; 

    inject(function(CurrentUser) { 
     mockUtilSvc = CurrentUser; 
    }); 

    beforeEach(inject(function($rootScope, $controller) { 
     scope = $rootScope.$new(); 
     ctrl = $controller('ReplyCtrl', { 
      $scope: scope 
     }); 
    })); 

    it('should return value from mock dependency', inject(function(mockUtilSvc) { 
     expect(mockUtilSvc()).toEqual(1); 
    })); 

}); 

To jest komunikat o błędzie, że byłem coraz:

Firefox 41.0.0 (Mac OS X 10.10.0) ReplyCtrl should return value from mock dependency FAILED 
    Error: [$injector:unpr] Unknown provider: mockUtilSvcProvider <- mockUtilSvc 

Odpowiedz

4

1) Masz inject w niewłaściwym miejscu. Podajesz funkcję wstrzykiwania w swoim teście it, po prostu ją usuń.

tj

it('should return value from mock dependency', inject(function(mockUtilSvc) { 
    expect(mockUtilSvc()).toEqual(1); 
})); 

staną

it('should return value from mock dependency', function() { 
    expect(mockUtilSvc()).toEqual(1); 
}); 

2) Teraz problem jest to, że mockUtilSvc jest instancją usługi, a nie funkcji, jak na swój definicji, również oparte na mock trzeba zdefiniuj go jako fabryczny (tzn. zwracasz 1 jako wartość fabryczną i nie jest to możliwe).

beforeEach(module(function($provide) { 
    $provide.factory('CurrentUser', function() { 
     return 1; 
     //If you expect factory to be a function then you need to return a function returning 1 here 
    }); 
})); 

i

expect(mockUtilSvc).toEqual(1); 

3) Można również napisać to jako:

$provide.value('CurrentUser', 1); //Provide the instance here right away 

4) Twój pierwszy inject jest również w niewłaściwym miejscu. Po prostu uruchamiasz go, ale nie uruchamiasz i przypisujesz instancję podczas każdego uruchomienia spec. before Each iteracji trzeba ustawić wartość instancji usługi do zmiennej, tj:

beforeEach(inject(function(CurrentUser) { 
    mockUtilSvc = CurrentUser; 
})); 

Przykładem testu:

describe('ReplyCtrl', function() { 
    var mockData = { 
      id: 1234, 
      hotel_id: 1, 
     }, mockUtilSvc, scope, ctrl ; 


    beforeEach(module('conciergeApp', function($provide) { 
     $provide.value('CurrentUser', mockData); 
    })); 

    beforeEach(inject(function(CurrentUser, $rootScope, $controller) { 
     mockUtilSvc = CurrentUser; 
     scope = $rootScope.$new(); 
     ctrl = $controller('ReplyCtrl', { 
      $scope: scope 
     }); 
    })); 

    it('should return value from mock dependency', function() { 
     expect(mockUtilSvc.id).toEqual(mockData.id); 
    }); 
}); 

Demo

Uwaga: Istnieją inne sposoby Mock i wstrzyknąć próbę. Na przykład w tym przypadku nie trzeba również używać $provide.value. Zamiast tego można utworzyć mock obiektu i przekazać je w ciągu instancji kontrolera jak masz pełną kontrolę nad tam przejść zależność, jak poniżej:

ctrl = $controller('ReplyCtrl', { 
      $scope: scope, 
      CurrentUser: mockUtilSvc 
    }); 

W przypadku bardziej kompleksowej obsługi metodami można utworzyć makiety jak to.

mockSvc = jasmin.createSpyObj('MyService', ['method1', 'method2']); 
    mockSvc.method1.and.returnValue($q.when(mockData)); //Simulating a promise returned from an $http call in the method. 
+1

Hist first 'inject' jest również w niewłaściwym miejscu.Powinien mieć to w 'beforeEach' – Phil

+0

@Phil True, wspomniałem o tym w kroku 4, prawdopodobnie niezbyt jasne. pozwól mi go zaktualizować. Dziękuję Ci. – PSL

+0

@PSL świetna odpowiedź, i dziękuję za dokładne wyjaśnienie. Dzięki temu jest o wiele bardziej przejrzyste, co się tutaj dzieje, i logika stojąca za tym, jak skonfigurować ten próbny test serwisowy. Dziękuję Ci! –

Powiązane problemy