【问题标题】:Angular test Unknown providerAngular 测试未知的提供者
【发布时间】:2015-12-28 14:16:40
【问题描述】:

我目前正在尝试测试 view1(home.js),在 view1 中,我使用了从 view1_test.js 移动到 app.js 级别的过滤器和指令。我所有的测试都过去了,现在任何引用过滤器或指令的东西都无法通过测试。我想知道我需要创建一个 app_test.js 还是有办法修复测试以使其仍然有效?下面是我所说的一个例子。

app.js

'use strict';

// Declare app level module which depends on views, and components
angular.module('myApp', [
    'ngRoute',
    'myApp.home',
    'ngAnimate',
    'ui.bootstrap',
    'ui.date'
]).
config(['$routeProvider','$httpProvider','$locationProvider', function($routeProvider) {
    $routeProvider.otherwise({redirectTo: '/home'});
}])
.filter('upper', function () {
    return function (input) {
        return input.toUpperCase();
    };
})

view1.js(home.js)

'use strict';

angular.module('myApp.home', ['ngRoute'])
.config(['$routeProvider', function ($routeProvider) {
    $routeProvider.when('/home', {
        templateUrl: 'home/home.html',
        controller: 'HomeCtrl'
    });
}])

view1_test.js(home_test.js)

'use strict';
describe('myApp.home module', function () {
    beforeEach(module('myApp.home'));
}

describe('Filter: upper', function () {
    var upperFilter;

    beforeEach(inject(function (_upperFilter_) {
        upperFilter = _upperFilter_;
    }));

    it('should be able to uppercase an entire input', function () {
        expect(upperFilter('hello')).toBe('HELLO');
        expect(upperFilter('hello world')).toBe('HELLO WORLD');
    });

});

在运行此测试时。我明白了:

Chrome 47.0.2526 (Windows 7 0.0.0) myApp.home 模块过滤器:upper 应该能够将整个输入大写 FAILED 错误:[$injector:unpr] 未知提供者:upperFilterProvider http://errors.angularjs.org/1.4.7/$injector/unpr?p0=upperFilterProvider%20%3C-%20upperFilter 在 C:/webroot/member_portal/app/bower_components/angular/angular.js:68:12 在 C:/webroot/member_portal/app/bower_components/angular/angular.js:4289:19 在 Object.getService [as get] (C:/webroot/member_portal/app/bower_components/angular/angular.js:4437:39) 在 C:/webroot/member_portal/app/bower_components/angular/angular.js:4294:45 在 getService (C:/webroot/member_portal/app/bower_components/angular/angular.js:4437:39) 在 Object.invoke (C:/webroot/member_portal/app/bower_components/angular/angular.js:4469:13) 在 Object.workFn (C:/webroot/member_portal/app/bower_components/angular-mocks/angular-mocks.js:2438:20) 错误:声明位置 在 window.inject.angular.mock.inject (C:/webroot/member_portal/app/bower_components/angular-mocks/angular-mocks.js:2409:25) 在套房。 (C:/webroot/member_portal/app/home/home_test.js:766:20) 在套房。 (C:/webroot/member_portal/app/home/home_test.js:763:5) 在 C:/webroot/member_portal/app/home/home_test.js:3:1 类型错误:upperFilter 不是函数 在对象。 (C:/webroot/member_portal/app/home/home_test.js:771:20) Chrome 47.0.2526 (Windows 7 0.0.0):执行 1 of 54 (1 FAILED) (跳过 53) ERROR (0.327 secs / 0.005 secs)

【问题讨论】:

    标签: javascript angularjs node.js unit-testing


    【解决方案1】:

    您为每个文件声明了 2 个不同的模块

    app.js -> angular.module('myApp', [ ...

    view1.js -> angular.module('myApp.home', ['ngRoute'])

    在您的 home_test.js 中,您应该注入 myApp 模块而不是 myApp.home,因为您已将其移至该模块

    【讨论】:

    • 你能举个例子吗?我尝试更改 beforeEach(module('myApp.home')); -> beforeEach(module('myApp'));还有 beforeEach(module('myApp.home')); -> beforeEach(module('myApp'));beforeEach(module('myApp.home'));这两者都导致错误:[$injector:modulerr] 无法实例化模块 myApp 由于:错误:[$injector:modulerr] 无法实例化模块 ngAnimate 由于:错误:[$injector:nomod] 模块 'ngAnimate'不可用!您要么拼错了模块名称,要么忘记加载它。
    • 由于myApp 模块中的依赖关系而出现该错误。您可以模拟这些依赖项,或者将过滤器隔离在另一个模块中并注入该模块,或者您可以在测试中包含这些依赖项。
    猜你喜欢
    • 2015-03-04
    • 2015-04-03
    • 2012-09-02
    • 2017-04-16
    • 2017-10-08
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多