2014-12-16 10 views
8

Sto provando a fare alcuni test unitari con Jasmine nella mia applicazione Angular, ma sto affrontando alcuni errori.L'argomento 'fn' non è una funzione, quando si prova a fare il test unitario con Jasmine e AngularJS

errore

Error: [$injector:modulerr] Failed to instantiate module LocalStorageModule due to: 
Error: [ng:areq] Argument 'fn' is not a function, got string 

Spec

describe("testing the controller", function() { 

    var $controllerConstructor; 
    var scope; 

    beforeEach(module('app', ['ngRoute', 'LocalStorageModule'])); 
    beforeEach(inject(function ($controller, $rootScope) { 
     $controllerConstructor = $controller; 
     scope = $rootScope.$new(); 
    })); 

    it("should validate a contact", function() { 
     var ctrl = $controllerConstructor('crmContatosCtrl', { $scope: scope }); 
    }); 
}); 

App.js

angular 
    .module('app', ['ngRoute', 'LocalStorageModule']) 
    .config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) { 
     // My routeProvider here 
    }]); 

non sto usando né Yeoman né Karma, perché questa è la mia prima applicazione con Angular.

file inclusi

<script src="../../Scripts/jasmine/jasmine.js"></script> 
<script src="../../Scripts/jasmine/jasmine-html.js"></script> 
<script src="../../Scripts/jasmine/boot.js"></script> 
<script src="../../Scripts/angular/angular.js"></script> 
<script src="../../Scripts/angular/angular-mocks.js"></script> 

<script src="../../Scripts/angular/angular-route.js"></script> 
<script src="../../Scripts/angular/angular-local-storage.js"></script> 
<script src="../../Scripts/ngStorage.js"></script> 
<script src="../../Scripts/ng-infinite-scroll.js"></script> 
<script src="../../Scripts/angular/common.js"></script> 

<link href="../../Scripts/jasmine/jasmine.css" rel="stylesheet" /> 

<script src="../core/app.js"></script> 
<script src="../crm/contatos.js"></script> 
<script src="contatosSpec.js"></script> 
+0

vorrei suggerire di creare il Ctrl nel beforeeach – sam

+0

@ Sam penso l'ho fatto per iniezione, no? –

+0

Sto parlando di questa riga: var ctrl = $ controllerConstructor ('crmContatosCtrl', {$ scope: scope}); prova a dichiararlo come scope (var ctrl) e inizializzalo in beforeeach – sam

risposta

15

penso che si può semplicemente avere un problema con la configurazione per le dipendenze per i test. Senza Karma non so come si fanno i test ma credo che tu abbia da qualche parte un file di configurazione per Jasmine in cui specifichi i file da includere. Devi includere tutti i file e devi includere prima tutte le librerie. Fai attenzione con l'ordine e cerca di rispettare lo stesso del file html che usi per eseguire l'applicazione.

Se l'ordine è errato, il JS proverà ad eseguire prima che le librerie di cui ha bisogno siano incluse. Nel tuo caso forse anche l'intera pila angolare.

Aggiornamento

Non dimenticate che Jasmine funziona utilizzando il proprio file html e non includerà le librerie di solito si usa se non dite. E inoltre non dimenticare di includere angolare biblioteca Mock, essenziale per i test

Update 2

Ok penso che ho trovato il motivo per cui hai un problema

C'è qualcosa di sbagliato in questo codice

beforeEach(module('app', ['ngRoute', 'LocalStorageModule'])); 

In angolare quando si chiama un modulo modulo usando ('smthg', []) che si sta creando , non chiamandolo. Dovresti invece utilizzare questo modulo, non è necessario reimportare i servizi che hai già incluso nel tuo modulo principale.

beforeEach(module('app')); 

controllo della Creazione contro sezione di recupero della documentazione angolare https://docs.angularjs.org/guide/module

+0

Ho aggiornato la mia risposta per includere Angular Mock – sam

+0

Woohoo, questo ha fatto il trucco per me! Stavo stupidamente chiamando primaOach (modulo ('app'), []) che sembrava perdere le dipendenze definite altrove nella mia app. Grazie. –

Problemi correlati