为什么我的单元测试中没有$ injector找到$ state?

时间:2016-08-25 22:22:35

标签: angularjs unit-testing angular-ui-router

以下是我的模块和单元测试设置。当我尝试设置$ state时,$injector.get("$state")会抛出始终有趣的未知提供商:$ stateProvider< - $ state 错误,我不明白为什么。

angular.module("my-module", [
        //Third Party
        "ui.bootstrap",
        "ui.router",
        "toaster",
        "angular-loading-bar",
        "ngAnimate",
        "ngSanitize",
        "ApplicationInsightsModule",
        "pascalprecht.translate"
]);

describe("something descriptive and helpful", (): void => {
    // a bunch of other service variables....
    var $state: any;

    // I've tried with and without this line
    beforeEach(() => angular.module("ui.router")); 

    beforeEach(() => {

        angular.module("my-module");

        inject(($injector: ng.auto.IInjectorService): void => {
            // a bunch of other service variable assignments
            $state = $injector.get("$state");
        });
});

2 个答案:

答案 0 :(得分:2)

您需要致电

angular.mock.module("my-module")

加载模块。

答案 1 :(得分:1)

模拟$stateProvider$state的目的是存根第三方服务并仅隔离自己的代码,从而减少移动部件的数量。

基本上是

beforeEach(module("my-module", ($provide) => {
  $provide.factory('$state', ($q) => ({
    go: jasmine.createSpy().andCallFake(() => $q.resolve());
  }));
})); 

it('...', inject(($state, ...) => {
  ...
  expect($state.go).toHaveBeenCalledWith('stateName');
});

此时ui.router模块不应该加载到测试模块中,因为它需要额外的存根。

另见this answer有关如何测试$stateProvider路由配置的说明。