2014-01-06 68 views
27

我在爲AngularJS服務正確提供依賴項時遇到了很多麻煩。

我在StackOverflow上看到一些其他類似錯誤的帖子,但他們都沒有解決這個問題。

下面是應用程序的代碼:

cm.modules.app = angular.module('myApp', ['ngRoute', 'ngAnimate']); 
myServiceName = function($http) { 
    // do stuff 
}; 
myServiceName.prototype.value = 1; 

cm.modules.app.service('defaultAlertFactoryA', myServiceName); 

下面是測試代碼:

describe('test alertFactoryA', function() { 
    var $provide; 
    var mAlertFactoryA; 

    beforeEach(module(cm.modules.app)); 

    beforeEach(angular.mock.module(function(_$provide_) { 
    $provide = _$provide_; 
    })); 

    beforeEach(function() { 
    inject(function($injector) { 
     mAlertFactoryA = $injector.get('defaultAlertFactoryA'); 
    }); 
    }); 

    it('should work', function() { 
    expect(true).toBe(true); 
    }); 
}); 

以下是錯誤:

Error: [$injector:unpr] Unknown provider: defaultAlertFactoryAProvider <- defaultAlertFactoryA http://errors.angularjs.org/1.2.0-rc.2/ $injector/unpr?p0=defaultAlertFactoryAProvider%20%3C-%20defaultAlertFactoryA

問:我如何解決這個問題,從而測試通過?

+2

包含在您的業力配置文件服務的文件? (我假設你正在使用業力) – dcodesmith

+0

@dcodesmith我正在使用Karma ...是的;檢查我做了console.log(myServiceName);從測試內部解決了參考罰款 – eb80

回答

16

下面是我用得到它的工作(終於)

beforeEach(function() { 
    module(cm.modules.app.name); 

    module(function($provide) { 
     $provide.service('defaultAlertFactoryA', myServiceName); 
    }); 

    inject(function($injector) { 
     defaultAlertFactory = $injector.get('defaultAlertFactoryA'); 
    }); 
}); 
22

爲了引導你的模塊,你需要提供其名稱

beforeEach(module('myApp')); 

Demo

8

聽起來就像你需要在你的karma.conf.js文件中包含服務文件

files: [ 

    'app/bower_components/angular/angular.js', 
    'app/bower_components/angular-mocks/angular-mocks.js', 
    'app/bower_components/angular-ui-router/release/angular-ui-router.js', 
    'app/app.js', 
    'app/controllers/*.js', 
    'app/services/*.js', 
    'tests/**/*.js' 
], 

如果不包括在這裏,他們不能在單元存取測試

相關問題