2013-09-30 15 views
6

w moim głównym describe Mam następujący:szyderczy Cookies z Kątowymi

beforeEach(inject(function(...) { 
    var mockCookieService = { 
     _cookies: {}, 
     get: function(key) { 
      return this._cookies[key]; 
     }, 
     put: function(key, value) { 
      this._cookies[key] = value; 
     } 
    } 

    cookieService = mockCookieService; 

    mainCtrl = $controller('MainCtrl', { 
     ... 
     $cookieStore: cookieService 
    } 
} 

Później chcę przetestować jak kontroler wierzy czy ciasteczko już istnieje, więc gniazdo następuje opisać:

describe('If the cookie already exists', function() { 
    beforeEach(function() { 
     cookieService.put('myUUID', 'TEST'); 
    }); 

    it('Should do not retrieve UUID from server', function() { 
     expect(userService.getNewUUID).not.toHaveBeenCalled(); 
    }); 
}); 

Jednak gdy dokonuję zmiany na cookieService, nie będzie to trwało w tworzonym kontrolerze. Czy podejmuję niewłaściwe podejście?

Dzięki!

EDIT: Zaktualizowany kod testowania i to jak używam $ CookieStore:

var app = angular.module('MyApp', ['UserService', 'ngCookies']); 

app.controller('MainCtrl', function ($scope, UserService, $cookieStore) { 
var uuid = $cookieStore.get('myUUID'); 

if (typeof uuid == 'undefined') { 
    UserService.getNewUUID().$then(function(response) { 
     uuid = response.data.uuid; 
     $cookieStore.put('myUUID', uuid); 
    }); 
} 

});

+0

Czy możesz pokazać, w jaki sposób $ cookieStore jest używane w twoim kontrolerze? A jak przetestujesz kontroler? –

+0

Zaktualizowany, daj mi znać, jeśli potrzebujesz więcej kodu testowego. – grivescorbett

+0

Co masz na myśli, mówiąc: "nie utrzymuje się w kontrolerze"? Czy chcesz powiedzieć, że twój kontroler nie korzysta z makiety? Czy masz na myśli, że gdy nazwiesz '$ cookieStore.get()', nie możesz odzyskać oczekiwanej wartości? –

Odpowiedz

1

Twoje testy jednostkowe nie muszą tworzyć fałszywego $ cookieStore i zasadniczo ponownie implementować jego funkcjonalność. Możesz użyć funkcji Jasmine spyOn do utworzenia obiektu szpiegowskiego i zwrócenia wartości.

Utwórz obiekt pośredniczący

var cookieStoreStub = {}; 

Skonfiguruj obiekt szpiegowski przed utworzeniem regulatorowi

spyOn(cookieStoreStub, 'get').and.returnValue('TEST'); //Valid syntax in Jasmine 2.0+. 1.3 uses andReturnValue() 

mainCtrl = $controller('MainCtrl', { 
... 
$cookieStore: cookieStoreStub 
} 

testy jednostkowe pisać dla scenariusza, w którym plik cookie jest dostępny

describe('If the cookie already exists', function() { 
    it('Should not retrieve UUID from server', function() { 
     console.log(cookieStore.get('myUUID')); //Returns TEST, regardless of 'key' 
     expect(userService.getNewUUID).not.toHaveBeenCalled(); 
    }); 
}); 

Uwaga : Jeśli chcesz przetestować wiele scenariuszy cookieStore.get(), możesz chcieć przenieś tworzenie kontrolera do beforeEach() wewnątrz bloku . Umożliwia to wywołanie spyOn() i zwrócenie wartości odpowiedniej dla bloku opisowego.