2013-08-11 13 views
8

Próbuję zrozumieć, jak przetestować mój kod z jaśminem i angularJS. Napisałem projekt testowy ze sterownikiem i usługą wstrzykniętą. Teraz chcę przetestować kontroler i próbowałem wyśmiać wstrzykniętą usługę. Ale nie znalazłem sposobu na przetestowanie funkcji "Przybył" z mojego kontrolera. Oto mój jsfiddle: http://jsfiddle.net/2fwxS/Kontroler testowy z usługą wtrysku wewnątrz angularJS z jaśminem

controller.js:

angular.module('myApp.controllers', []) 
    .controller('MyCtrl', ['$scope', 'MyService', function ($scope, MyService) { 
    $scope.User = {}; 
    $scope.HasUserArrived = false; 
    $scope.Arrived = function(firstname, lastname) { 
    $scope.HasUserArrived = MyService.Arrive(firstname, lastname); 
    return $scope.HasUserArrived; 
    } 
}]); 

services.js:

var myApp = angular.module('myApp.services', []). 
    value('version', '0.1'); 

myApp.factory('MyService', [function() { 
    return { 
     HasArrived: false, 
     Arrive: function (firstname, lastname) { 
      this.HasArrived = false; 

      if (firstname && lastname) { 
       this.HasArrived = true; 
      } 

      console.log("User has arrived: " + this.HasArrived); 
      return this.HasArrived; 
     } 
    } 
}]); 

znalazłem kilka podobnych wyjaśnień gdzie $ dostarczają może być poprawne rozwiązanie (How can I write jasmine test for angular controller and service like this?) lub createSpy (How do you mock Angular service that is a function?), ale nie byłem w stanie zrozumieć, kiedy potrzebuję $ provider.factory lub $ provider.value lub kiedy powinienem użyć createSpy?

Byłbym wdzięczny, gdyby ktoś mógł mi pomóc zrozumieć różnice i dostaje kod wyłączona w moim jsFiddle (http://jsfiddle.net/2fwxS/) przykład uruchomiony ...

Odpowiedz

10

Należy używać $provide.value w celu zastąpienia oryginalna instancja obsługa z wyśmiewali jednym:

beforeEach(module(function($provide) { 
    var service = { 
     Arrive: function (firstname, lastname) { 
      if (firstname && lastname) { 
       return true; 
      } 
     } 
    }; 
    $provide.value('MyService', service); 
})); 

ja naprawdę nie wiem, dlaczego $provide.value prace ale $provide.factory nie. Spróbuję spojrzeć na kod Angulara później, żeby to zrozumieć. Zaktualizuję tę odpowiedź, jeśli coś się dowiem.

O szpiegach, powinieneś ich używać, jeśli chcesz sprawdzić, czy twoje drwiny są używane w sposób, w jaki powinny. Obejmuje to sprawdzanie parametrów i wywołań. Oto kod zmienił używać szpiega:

it('checks that Arrived is correctly used', function() { 
    // Arrange 
    spyOn(service, 'Arrive'); 

    // Act 
    scope.Arrived('Franz', 'Kafka'); 

    // Assert 
    expect(service.Arrive).toHaveBeenCalledWith('Franz', 'Kafka'); 
}); 

Tu masz stały jsFiddle.

+0

Przepraszam za spóźnioną odpowiedź! @Michael Dziękuję za odpowiedź i poprawiony jsFiddle. Dzięki tym małym zmianom udało mi się pomyślnie przeprowadzić testy! Naprawdę dobrze byłoby wiedzieć, dlaczego fabryka nie działa. – burgerS

+0

A mój współpracownik i ja jesteśmy zainteresowani, jeśli istnieje sposób na sprawdzenie usługi w tym przykładzie zamiast drwić z usługi. Wiemy, że powinniśmy przetestować usługę osobno, ale zastanawialiśmy się, czy testowanie usługi w tym przykładzie mogłoby być możliwe ... – burgerS

+1

Możesz uciec z kpiny z usługi, aby przetestować kontroler, jeśli usługa jest bardzo prosta i możesz bezpiecznie przewidzieć jego zachowanie, minimalizując szanse na przerwanie testów kontrolera z powodu błędu w realizacji usługi. Ale jeśli to zrobisz, będziesz testował kontroler, a nie usługę. Powinieneś przetestować usługę osobno, aby upewnić się, że działa tak, jak powinna. –

Powiązane problemy