2015-07-27 11 views
12

Używam frameworków Ionic do niestandardowych aplikacji. W trakcie tego procesu próbuję napisać test jednostki dla fabryki datastoreServices, która ma zależność od DomainService i $http. Jestem niezadowolony z wdrożenia testów Jasmine Unit.

Moje fabryki są następujące.

app.factory("datastoreServices", ["$http", function($http) { 
    return { 
     getData: function(data, DomainService) { 
      return $http.post(DomainService.host + 'factor', data); 
     } 
    }; 
}]); 

app.factory('DomainService', function() { //here 
    if (ionic.Platform.isAndroid()) { 
     return { 
      host: 'http://10.0.2.2:7001/' 
     } 
    } 
    return { 
     host: 'http://localhost:7001/' 
    } 
}) 

I mój szkielet testu jednostkowego wygląda następująco. Ma dwie zależności, więc nie mógł dowiedzieć się, jak postępować. To jest to, co dostałem do tej pory w jednostkowym pliku testowym.

describe(
     'datastoreServices', 
     function() { 
      beforeEach(module('Myapp')); 
      describe('getData'), 
       function() { 
        it("Should return correct values", inject(function(datastoreServices, DomainService, $httpBackend) { 
          expect(datastoreServices.getData(httpBackend.. /***something here!**/) 
           .toEqual("2.2"); 
          })) 
        } 

Mam bardzo małą wiedzę na temat szyderstwa i rzeczy. Czy ktoś może mi pomóc przetestować tę fabrykę datastoreServices. Testowane są następujące rzeczy:

  • Czy poczta Http wykonuje prawidłowe połączenia?
  • Czy funkcja zwraca właściwą obietnicę?

Oto podobny scenariusz aplikacji w plnkr.

Idk, jeśli proszę o zbyt wiele. Z góry dziękuję.

+0

Szczerze mówiąc, nie rozumiem problemu. Istnieje mnóstwo przykładów kpiących z $ http. Co tu jest tak wyjątkowego? BTW gdzie jest związek z jonowym? Kolejne pytanie: czy twoja aplikacja działa, tylko zmaga się z testem? – hgoebl

+0

Cóż, masz rację, że jest wiele przykładów kpiny z http. Jednak nie testuję tylko protokołu http, ale także kontrolera, który go zawiera. W sekcji opisowej mam dwa różne scenariusze testowe. Używany jest jon, ale nie jest to bardzo istotne dla pytania. I tak, aplikacja jest w pełni funkcjonalna, pożądane są tylko metody testowania dla każdej funkcji. Senario aplikacji jest dodawany jak w 'plnker' http://plnkr.co/edit/1CgLJgnmjt3sv2caP938. Jak byś przetestował każdą z tych funkcji. –

+0

Fabryczne 'foo' jest tylko bezużytecznym kodem standardowym i może zostać całkowicie wyeliminowane. Sterownik nie jest użytecznym kontrolerem. Powinieneś podać bardziej realistyczne przykłady, więc fajnie jest przetestować swój kod ;-) – hgoebl

Odpowiedz

2

Podstawowe zasady to:

  • $ HTTP jest wyśmiewany podczas testów, co oznacza, że ​​serwer nie jest w rzeczywistości nazywa się podczas wykonywania testu
  • należy użyć $ httpBackend aby dochodzić połączeń HTTP i mock odpowiedzi serwera https://docs.angularjs.org/api/ngMock/service/ $ httpBackend
  • łatwo można wstrzykiwać lub wyśmiewać wszelkie zależności potrzebne do testu

Oto przykład na podstawie na swoim kodzie OP:

describe('datastoreServices', function() { 

    beforeEach(module('MyApp')); 

    // get a reference to the $httpBackend mock and to the service to test, and create a mock for DomainService 
    var $httpBackend, datastoreServices, DomainService; 
    beforeEach(inject(function(_$httpBackend_, _datastoreServices_) { 
     $httpBackend = _$httpBackend_; 
     datastoreServices = _datastoreServices_; 
     DomainService = function() { 
      return { 
       host: 'http://localhost:7001/' 
      }; 
     }; 
    })); 

    // after each test, this ensure that every expected http calls have been realized and only them 
    afterEach(function() { 
     $httpBackend.verifyNoOutstandingExpectation(); 
     $httpBackend.verifyNoOutstandingRequest(); 
    }); 


    it('calls http backend to get data', function() { 
     var data = {foo: 'bar'}; 

     // write $http expectation and specify a mocked server response for the request 
     // see https://docs.angularjs.org/api/ngMock/service/$httpBackend 
     $httpBackend.expectPOST('http://localhost:7001/factor', data).respond(201, {bar: 'foo'}); 

     var returnedData; 
     datastoreServices.getData(data, DomainService).success(function(result) { 
      // check that returned result contains 
      returnedData = result; 
      expect(returnedData).toEqual({bar: 'foo'}); 
     }); 

     // simulate server response 
     $httpBackend.flush(); 

     // check that success handler has been called 
     expect(returnedData).toBeDefined(); 
    }); 
}); 
+0

Dziękuję za odpowiedź, ale to całkiem nie jest jasne dla mnie, ponieważ nie ma funkcji "it" lub funkcji do wypróżniania komunikatów, które są przekazywane każdemu testowi jednostkowemu.Próbowałem surround, każdy "oczekiwać" od 'it' i wydaje się, że nie działa. Czy możesz to wyjaśnić? –

+0

Otrzymuję 'datastoreServices getData napotkał wyjątek deklaracji. $ httpBackend jest niezdefiniowany ' –

+0

masz rację, zmień drugi opis() na to(), powinien rozwiązać błędy, które masz –