Angularjs $injector:使用Jasmine进行测试时,unpr未知提供程序错误

Angularjs $injector:使用Jasmine进行测试时,unpr未知提供程序错误,angularjs,unit-testing,jasmine,Angularjs,Unit Testing,Jasmine,因此,在这里第一次处理单元测试时,我尝试使用angular.mocks中的$componentControllermock初始化组件的控制器 这是我的组件文件 import angular from 'angular'; import ProgressCountdownModule from './progress-countdown/progress-countdown'; import CoverModule from './cover/cover'; import template f

因此,在这里第一次处理单元测试时,我尝试使用angular.mocks中的
$componentController
mock初始化组件的控制器

这是我的组件文件

import angular from 'angular';

import ProgressCountdownModule from './progress-countdown/progress-countdown';
import CoverModule from './cover/cover';

import template from './game.tmpl.html';
import './game.css';

import GameController from './game.controller.js';

const GameModule = angular.module('game', [ProgressCountdownModule.name, CoverModule.name])
    .component('game', {
        template,
        controller: GameController,
        controllerAs: 'vm'
    });

export default GameModule;
这是我的控制器的要点:

export default class GameController {
    constructor($stateParams, $timeout, ThemesModel) { /*...*/ }
} 
我将
ThemesModel
服务作为公共模块的一部分,该模块在主应用程序中作为依赖项拉入。以下是服务定义:

export default class ThemesModel {
    constructor($http) {
        'ngInject';

        this.$http = $http;
    }

    getThemes = () => this.$http.get('/api/themes');
    getShuffledThemeItems = (theme, levelSeed) => this.$http.get(`/api/themes/${theme}/${levelSeed}`);
}
我在ThemesModel中模拟(或至少尝试)了
getShuffledItems
方法

我尝试编写一个测试来检查控制器是否有效:

import GameModule from './game';
import GameController from './game.controller';

describe('Game', () => {

    let component, $componentController, $stateParams, $timeout, ThemesModel;

    beforeEach(() => {
        window.module(GameModule);

        window.module($provide => {
            $provide.value('ThemesModel', {
                getShuffledThemeItems: (theme, levelSeed) => {
                    return {
                        then: () => { }
                    };
                }
            });
        });
    });


    beforeEach(inject((_$componentController_, _$timeout_, _ThemesModel_) => {
        $componentController = _$componentController_;
        $timeout = _$timeout_;
        ThemesModel = _ThemesModel_;
    }));

    describe('Controller', () => {
        it('calls ThemesModel.getShuffledThemeItems immediately', () => {

            $stateParams = { /*...*/ }

            spyOn(ThemesModel, 'getShuffledThemeItems').and.callThrough();

            component = $componentController('game', {
                $stateParams,
                $timeout,
                ThemesModel
            });

            expect(ThemesModel.getShuffledThemes).toHaveBeenCalled();
        })
    });

});
当我使用此设置运行
karma start
时,我会出现以下错误:

游戏 控制器
✗ 有一个初始状态错误:[$injector:unpr]未知提供程序:gameDirectiveProvider我想,我找到了它-这是因为您尚未注册模块配置。这类错误最难发现:

window.module(GameModule);
需要更改为:

window.module(GameModule.name);

天哪,就是这样!非常感谢:)这就是重新审视代码的力量:)
window.module(GameModule.name);