2013-06-27 14 views
6

Mam aplikację, która używa Angular Translate (https://github.com/PascalPrecht/angular-translate). Tłumacz działa świetnie w aplikacji za pośrednictwem przeglądarki, ale kiedy próbuję przetestować dowolny kontroler, pojawia się błąd Błąd: nieoczekiwane żądanie: GET locale/locale-en.json. W jaki sposób mogę przetestować swoje kontrolery, ponieważ translate wykonuje żądanie GET dla pliku językowego podczas uruchamiania?Jak przetestować kontrolery z Angular Translate zainicjowanym w App Config?

Używam generatora kątowego Yeomana z Karmą.


App.js:

angular.module('myApp', ['ngCookies', 'ui.bootstrap', 'pascalprecht.translate']) 
    .config(function ($routeProvider, $locationProvider, $translateProvider) { 

    $routeProvider 
     .when('/', { 
     templateUrl: 'views/main.html', 
     controller: 'MainCtrl' 
     }) 
     .otherwise({ 
     redirectTo: '/' 
     }); 

     $translateProvider.useStaticFilesLoader({ 
     prefix: 'locale/locale-', 
     suffix: '.json' 
     }); 
     $translateProvider.uses('en'); 
     $translateProvider.useLocalStorage(); 
    }); 

testowe Kontroler:

describe('Controller: DocumentationCtrl', function() { 

    // load the controller's module 
    beforeEach(module('myApp')); 

    var DocumentationCtrl, 
    scope, 
    $httpBackend; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function ($controller, $rootScope, $injector) { 
    $httpBackend = $injector.get('$httpBackend'); 
    scope = $rootScope.$new(); 
    DocumentationCtrl = $controller('DocumentationCtrl', { 
     $scope: scope 
    }); 
    })); 

    it('should attach a list of awesomeThings to the scope', function() { 
    $httpBackend.whenGET('locale/locale-en.json').respond(200, { 
     "TITLE": 'My App' 
    }); 
    expect(scope.awesomeThings.length).toBe(3); 
    }); 

}); 

Dokumentacja sterownika jest tylko standardowy generowane kontrolera.

Odpowiedz

5

Musisz określić preferowany język w fazie konfiguracji, a następnie uruchomić fazę. Tak więc $translate.uses('us') staje się $translateProvider.preferredLanguage('us'). To samo dotyczy useLocalStorage(). Są to wszystkie metody konfiguracji usługi $translate.

Powinieneś także unikać ustawienia uses(), aby ustawić domyślny język. Zamiast tego użyj preferredLanguage(). Powodem tego jest, że $translate.uses() próbuje załadować plik i18n tak szybko, jak to możliwe, , jeśli jest plik cookie lub podobny, który używa innego klucza językowego, uses() załaduje dwa pliki, dlatego wprowadziliśmy preferredLanguage() I tak, to powinno rozwiązać problem.

+0

Dziękuję bardzo za odpowiedź. Nadal nie jestem pewien, jak to przetestować, chociaż przełączyłem się na Preferowany język(), więc mój app.config wygląda tak: $ translateProvider.useStaticFilesLoader ({ prefiks: "locale/locale-", sufiks: '.json ' }); $ translateProvider.preferredLanguage ("nas"); $ translateProvider.useLocalStorage(); – Zacho

+0

Och i błąd występuje, ponieważ nie oczekujesz od użytkownika żądania HTTP. Tak więc w specyfikacji your it() powinieneś zrobić coś takiego: $ http.expectGET ("locale/locale-us.json"); I nie zapomnij spuścić oczekujących odpowiedzi przez $ http.flush(); – PascalPrecht

+0

Mam to działa. Poprawka polegała na użyciu preferredLanguage() i zastąpieniu tej funkcji przed zainicjalizowaniem aplikacji w moim teście jednostkowym. Jest to spora aplikacja i nie chciałem umieścić locale expectGET w każdym pojedynczym teście jednostkowym. Dzięki! – Zacho

1

Należy unikać inicjalizowania modułu poziomu aplikacji, umieszczania kontrolerów w myApp.controllers i testowania tego modułu zamiast tego.

"Zalecamy rozbicie aplikacji na wiele modułów. (...) Powodem tego rozpadu jest to, że w testach często konieczne jest zignorowanie kodu inicjalizacyjnego, który jest trudny do przetestowania. "

http://docs.angularjs.org/guide/module

+1

Próbowałem tego i nadal wydaje się, że do zrobienia, ale problem pozostaje ten sam z nieoczekiwanym GET /locale/en-us.json. – Zacho

0

myślę, że masz zły kolejności: setup dla kątowych-translate próbuje załadowaniu odpowiedniego języka po wywołaniu uses(lang) (po bloku, rzeczywiście).

Mieliśmy podobne problemy przy opracowywaniu adapterów w języku anguluar-translate. Spróbuj przejrzeć https://github.com/PascalPrecht/angular-translate-loader-url/blob/16e559030bce819e8ca1b82fed7163286b57bafe/test/unit/translateUrlLoaderSpec.js, które są testami wtyczki do ładowania adresów URL.

Czy sterownik nie powinien zostać wstrzyknięty o krok później?

+0

Myślałem o tym również, jednak próbowałem umieszczać expectGET/whenGET w kilku różnych pozycjach. Problem, o którym myślę, to jest to, o czym się nie zastanawiasz, to jest problem z kurczakiem i jajkiem. Zasadniczo muszę zdefiniować whenGET przed uruchomieniem aplikacji, ale aplikacja musi najpierw wykonać instancję. Wszelkie przykłady, jak to osiągnąć? Czy muszę najpierw załadować translate do mojego testu, a potem do mojej aplikacji? – Zacho

Powiązane problemy