2013-05-15 5 views
9

Pracuję z AngularJS + Karma. configService zarządza ustawieniami mojej aplikacji (np. Kolor tła, w przeciwnym razie jest włączony tryb debugowania, ogólne uprawnienia ...). Ładuje początkowe dane za pomocą $ http. Test został pomyślnie napisany dla usługi, ale moje dyrektywy i kontrolery go używają.AngularJS + Karma: ponownie używaj fałszywej usługi podczas testowania urządzeń lub kontrolerów

Kiedy piszę testy jednostek dla dyrektyw, muszę wyśmiać serwis.

wiem, że mogę zrobić:

spyOn(configService, 'getBackgroundColor').andCallFake(function (params) { 
    return "red"; 
}); 

ale usługa ma 25+ metod i początkowy ładunek danych. Nie mam ochoty pisać (i utrzymywać) tego spyOna w każdym zestawie testów. Co więcej, ładuję dane w fabryce za pomocą $ http, które również powinny być wyśmiewane. jeśli po prostu wstrzyknę usługę i wyśmieję połączenia, nadal będę wysyłał żądanie http.

Jak myślisz, co jest najlepszym sposobem na ponowne użycie makiety?

+0

Po prostu chcesz podzielić się próbą usługi pośród wielu testów? A może szukasz sposobu na sfałszowanie wywołania $ http i skorzystania z usługi w twoich testach dyrektywy i kontrolera? –

+0

udostępnij próbę usługi wśród wielu zestawów testowych. dokładniej, unikaj wklejania kopii na długo przedEach(). Wczoraj utworzyłem usługę w module 'myapp.mocks' i umieściłem ją w testacular.conf.js, a następnie ładuję ją za pomocą' module (myapp.mocks) '. Wyodrębniłem również odpowiedź mojego serwera do innego pliku i utworzyłem 'var RESPONSE_SERVER = {json here}'. jeśli to brzmi jak dobre rozwiązanie, rozwiążę więcej i odpowiem sobie poniżej: –

+1

To jest właśnie to, co zamierzałem polecić. Stworzyłem plik .js, który zawierał zwykłą starą funkcję javascript, którą wywołałem, aby utworzyć próbę. Inna prosta stara funkcja javascript do konfigurowania odpowiedzi serwera na testy.I jak mówisz, jeśli zdefiniujesz zmienną globalną z odpowiedziami json, możesz użyć jej w swoich testach do porównania. –

Odpowiedz

0

Utworzono plik .js, który zawierał zwykłą, starą funkcję javascript, którą wywołałem, aby utworzyć próbę. Inna prosta stara funkcja javascript do konfigurowania odpowiedzi serwera na testy. I tak jak mówisz, jeśli zdefiniować zmienną globalną z odpowiedzi json następnie można użyć, że w badaniach, aby porównać przeciwko

8

Zamiast natrysku kodu testowego z szpiegów można stworzyć właściwą makiety usługi w własny moduł i dodaj go w każdym teście, który tego potrzebuje.

Test jednostki kontrolera znajduje się w pliku test/spec/modules/user/controller.js.

Wyśmiewana usługa znajduje się w pliku test/mock/modules/user/service.js.

dla metody kontrolera:

$scope.refreshList = function() { 
    UserService.all(pageNumber, size, sort, function(data) { 
    $scope.users = data.content; 
    $scope.page = data.page; 
    }); 
}; 

szydzili usługa:

(function() { 

'use strict'; 

angular.module('app.user.mock', ['app.user']); 

angular.module('app.user.mock').factory('UserServiceMock', 
    ['$q', 
    function($q) { 
    var factory = {}; 

    factory.mockedUsers = { 
     content: [ { firstname: 'Spirou', lastname: 'Fantasio', email: '[email protected]', workPhone: '983743464365' } ], 
     page: '1' 
    }; 

    factory.search = function(searchTerm, page, size, sort, callback) { 
     var defer = $q.defer(); 
     defer.resolve(this.mockedUsers); 
     defer.promise.then(callback); 
     return defer.promise; 
    }; 

    factory.all = function(page, size, sort, callback) { 
     var defer = $q.defer(); 
     defer.resolve(this.mockedUsers); 
     defer.promise.then(callback); 
     return defer.promise; 
    }; 

    return factory; 
    } 
]); 

})(); 

i testy jednostka kontroler:

(function() { 

'use strict'; 

var $scope; 
var listController; 
var UserServiceMock; 

beforeEach(function() { 
    module('app.project'); 
    module('app.user.mock'); // (1) 
}); 

beforeEach(inject(function($rootScope, _UserServiceMock_) { 
    $scope = $rootScope.$new(); 
    UserServiceMock = _UserServiceMock_; // (2) 
})); 

describe('user.listCtrl', function() { 

    beforeEach(inject(function($controller) { 
    listController = $controller('user.listCtrl', { 
     $scope: $scope, 
     UserService: UserServiceMock 
    }); 
    })); 

    it('should have a search function', function() { // (3) 
    expect(angular.isFunction(UserServiceMock.search)).toBe(true); 
    }); 

    it('should have an all function', function() { 
    expect(angular.isFunction(UserServiceMock.all)).toBe(true); 
    }); 

    it('should have mocked users in the service', function() { 
    expect(UserServiceMock.mockedUsers).toBeDefined(); 
    }); 

    it('should set the list of users in the scope', function(){ 
    expect($scope.users).not.toEqual(UserServiceMock.mockedUsers); 
    $scope.refreshList(); 
    $scope.$digest(); 
    expect($scope.users).toEqual(UserServiceMock.mockedUsers.content); 
    }); 

}); 

})(); 

Państwo dodać moduł zawierający app.user.mock wyśmiewana usługa (1) i wstrzyknąć wyśmiewaną usługę w kontrolerze (2).

Możesz następnie przetestować wstrząśnięty serwis (3).

+0

Czy znasz jakiś sposób, aby uzyskać jaśmin w taki sposób? Aby móc używać 'jaśmin.spyOn' zamiast śledzić połączenia ręcznie. – dshepherd

Powiązane problemy