2013-06-27 14 views
6

Ho un'app che utilizza Angular Translate (https://github.com/PascalPrecht/angular-translate). Traduci funziona perfettamente nell'applicazione tramite browser, ma quando provo a testare qualsiasi controller ottengo l'errore : Richiesta inaspettata: GET locale/locale-it.json. Come faccio a testare i miei controller unitari dal momento che translate fa una richiesta GET per il file di lingua all'avvio?Come si testano i controller con Angular Translate inizializzato in App Config?

Sto usando il generatore angolare yeoman con Karma.


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(); 
    }); 

prova Controller:

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); 
    }); 

}); 

controller La documentazione è solo un controller standard generato.

risposta

5

È necessario specificare la lingua preferita nella fase di configurazione piuttosto che eseguire la fase. Quindi $translate.uses('us') diventa $translateProvider.preferredLanguage('us'). Lo stesso vale per useLocalStorage(). Questi sono tutti i metodi per configurare il servizio $translate.

Si dovrebbe anche provare a evitare uses() per impostare una lingua predefinita. Utilizzare invece preferredLanguage(). La ragione di ciò è che $translate.uses() prova a caricare un file i18n il prima possibile, se c'è un cookie o simile che usa un'altra lingua, uses() caricherà due file, questo perché abbiamo introdotto preferredLanguage() E sì, questo dovrebbe risolvere il problema problema.

+0

Grazie mille per la risposta. Non sono ancora sicuro di come testarlo, anche se sono passato a preferredLanguage(), quindi il mio app.config ha questo aspetto: $ translateProvider.useStaticFilesLoader ({ prefisso: 'locale/locale-', suffisso : '.json ' }); $ translateProvider.preferredLanguage ('us'); $ translateProvider.useLocalStorage(); – Zacho

+0

Oh e l'errore si verifica perché non ti aspetti una richiesta di ottenere http in modo esplosivo. Quindi nella tua specifica it() dovresti fare qualcosa del tipo: $ http.expectGET ('locale/locale-us.json'); E non dimenticare di svuotare le risposte in sospeso tramite $ http.flush(); – PascalPrecht

+0

Ho funzionato. La soluzione era usare preferredLanguage() e sovrascrivere la funzione prima di inizializzare l'app nel mio test di unità. Questa è un'app considerevole e non volevo mettere il expectGET locale in ogni singolo test dell'unità. Grazie! – Zacho

1

Evitare di inizializzare il modulo del livello dell'applicazione, inserire i controller in myApp.controllers e testare questo modulo.

"Si consiglia di interrompere l'applicazione su più moduli. (...) Il motivo di questa separazione è che nei test è spesso necessario ignorare il codice di inizializzazione, che tende a essere difficile da verificare. "

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

+1

Ho provato quello e sembra ancora la strada da percorrere, ma il problema rimane lo stesso con l'inaspettato GET /locale/en-us.json. – Zacho

0

io pensi di avere un ordine errato: L'impostazione per-translate angolari cerca di caricare il proprio linguaggio dopo aver chiamato uses(lang) (dopo il blocco, in effetti).

Abbiamo avuto problemi simili nello sviluppo degli adattatori in anguluar-translate. Prova a esaminare https://github.com/PascalPrecht/angular-translate-loader-url/blob/16e559030bce819e8ca1b82fed7163286b57bafe/test/unit/translateUrlLoaderSpec.js quali sono i test per il plugin del caricatore url.

Il controller non deve essere iniettato un passaggio successivo?

+0

Ci stavo pensando anche io, tuttavia ho provato a inserire expectGET/whenGET in diverse posizioni. Il problema che penso è quello che potresti eludere a causa del fatto che si tratta di un problema di uova e galline. Fondamentalmente ho bisogno di definire il whenGET prima che l'app funzioni, ma l'app ha bisogno di essere istanziata prima. Qualche esempio su come realizzarlo? Devo caricare la traduzione prima nel mio test, poi nella mia app? – Zacho

Problemi correlati