2016-01-11 3 views
6

Dies ist mein erstes Mal mit Jasmine, und ich habe meine erste Fabrik ohne Probleme getestet.Verwenden Sie Jasmine, um einen Dienst mit uibModal und lodash als Abhängigkeiten zu testen

Aber jetzt möchte ich diesen Service testen:

angular.module('Questions', []) 
.service('QuestionsService', function($uibModal, $log, _) { 
    ... 
} 

$ uibModal von UI Bootstrap ist (siehe here) und _ ist Lodash.

Mein Jasmin Test so weit ist:

describe('Service: QuestionsService', function() { 

    var QuestionsService; 

    beforeEach(inject(function(_QuestionsService_) { 
     QuestionsService = _QuestionsService_; 
    })); 

    ... 
} 

Und wenn ich versuche, es (Grunzen-Test), erhalte ich folgende Fehlermeldung:

Error: [$injector:unpr] Unknown provider: $uibModalProvider <- $uibModal <- QuestionsService

Und irgendwann hatte ich auch:

Error: [$injector:unpr] Unknown provider: _Provider <- _ <- QuestionsService

Wenn es helfen kann, mein Karma conf ist:

module.exports = function(config) { 
    'use strict'; 
    config.set({ 
    autoWatch: true, 
    basePath: '../', 

    frameworks: [ 
     "jasmine" 
    ], 

    // list of files/patterns to load in the browser 
    files: [ 
     // bower:js 
     'bower_components/jquery/dist/jquery.js', 
     'bower_components/lodash/lodash.js', 
     'bower_components/angular/angular.js', 
     'bower_components/bootstrap-sass-official/assets/javascripts/bootstrap.js', 
     'bower_components/angular-animate/angular-animate.js', 
     'bower_components/angular-cookies/angular-cookies.js', 
     'bower_components/angular-resource/angular-resource.js', 
     'bower_components/angular-route/angular-route.js', 
     'bower_components/angular-sanitize/angular-sanitize.js', 
     'bower_components/angular-touch/angular-touch.js', 
     'bower_components/angular-bootstrap/ui-bootstrap-tpls.js', 
     'bower_components/angular-mocks/angular-mocks.js', 
     // endbower 
     "app/scripts/**/*.js", 
     "test/mock/**/*.js", 
     "test/spec/**/*.js", 
    ], 
    exclude: [ 
    ], 
    port: 8080, 
    browsers: [ 
     "PhantomJS" 
    ], 
    plugins: [ 
     "karma-phantomjs-launcher", 
     "karma-jasmine" 
    ], 
    singleRun: false, 
    colors: true, 
    logLevel: config.LOG_INFO, 
    }); 
}; 
+0

In Ihrer Karma-Konfigurationsdatei, in der Sie definieren, welche Dateien eingeschlossen werden sollen, definieren Sie explizit Ihre Anwendungsinitialisierung ('app.js') nach den Abhängigkeiten, aber vor dem Rest Ihrer Dateien. Es würde also direkt vor "app/scripts/**/*. Js" gehen. Es ist möglich, dass Sie neue Dateien geschrieben haben, die karma vor der Startdatei der Anwendung hinzufügt. – Healforgreen

+1

Vielen Dank für Ihre Hilfe. Ich habe versucht, meine "app/scripts/app.js" vor "app/scripts/**/*. Js" hinzuzufügen, aber das Problem ist geblieben. – didjoman

+1

Und deine 'app.js' enthalten Lodash und UI-Bootstrap? 'angular.module ('app', ['unterstrichen', 'ui.bootstrap']);' – Healforgreen

Antwort

0

Das Modul der App wurde nicht in den Test einbezogen. Die umstrukturierte Test für die QuestionService wäre:

describe('Service: QuestionsService', function() { 

    var QuestionsService; 

    // The module needs to be included in the test. 
    beforeEach(module('boardgameApp')); 

    beforeEach(inject(function(_QuestionsService_) { 
     QuestionsService = _QuestionsService_; 
    })); 

    ... 
} 
1

Nur für den Fall aus anderen Ländern finden. Um den Fehler zu lösen, wenn eine Richtlinie des Controllers zu testen, verspottete ich den $ uibModal Service, konzeptionell wie folgt aus:

describe('Service: QuestionsService', function() { 

    var controller; 

    beforeEach(inject(function($controller) { 
     controller = $controller('controllerName', { 
      $uibModal : {} 
     }); 
    })); 

    ... 
} 

$ uibModal muß mehr sein als nur ein leeres Objekt, wenn Sie Tests gegen Controller-Funktionen schreiben, die in Wechselwirkung treten damit.