AngularJS+;Jasmine单元测试错误:[$injector:moduler]

AngularJS+;Jasmine单元测试错误:[$injector:moduler],angularjs,unit-testing,jasmine,Angularjs,Unit Testing,Jasmine,我正在使用angular和jasmine进行单元测试。运行测试时,我遇到以下错误: 结果消息:错误:[$injector:moduler] $injector/moduler 单元测试 /// <reference path="../Scripts/_references.js" /> /// <reference path="jasmine.js" /> /// <reference path="SampleController.js" /> descri

我正在使用angular和jasmine进行单元测试。运行测试时,我遇到以下错误:

结果消息:错误:[$injector:moduler] $injector/moduler

单元测试

/// <reference path="../Scripts/_references.js" />
/// <reference path="jasmine.js" />
/// <reference path="SampleController.js" />

describe('Controller Unit Test: ', function () {
    var scope, ctrl, $timeout;
    var someServiceMock;

    beforeEach(function () {
        module('app');
    });

    beforeEach(function () {
        someServiceMock = jasmine.createSpyObj('someService', ['someAsyncCall']);
        inject(function ($rootScope, $controller, $q, _$timeout_) {
            scope = $rootScope.$new();
            someServiceMock.someAsyncCall.andReturn($q.when('weee'));
            $timeout = _$timeout_;
            ctrl = $controller('SampleController', {
                $scope: scope,
                someService: someServiceMock
            });
        });
    });

    it('Controller exists', function () {
        expect(ctrl).toBeDefined();
    });
});
最后,我的参考文件:

/// <reference path="angular.min.js" />
/// <reference path="angular-mocks.js" />
/// <reference path="angular-animate.min.js" />
/// <reference path="angular-sanitize.min.js" />
/// <reference path="angular-route.min.js" />
/// <reference path="jquery-2.1.1.min.js" />
/// <reference path="jquery.unobtrusive-ajax.js" />
/// <reference path="jquery.unobtrusive-ajax.min.js" />
/// <reference path="jquery.validate.min.js" />
/// <reference path="ui-bootstrap-tpls-0.14.3.min.js" />
/// <reference path="modernizr-2.8.3.js" />
//
/// 
/// 
/// 
/// 
/// 
/// 
/// 
/// 
/// 
/// 

在测试和运行调试模式下,当我在注入函数中设置断点时,它不会进入该模式。

尝试这样修改您的测试代码,我还随意修改了您的结构,这样您的测试可能会更有效率。对于较小的控制器/测试,这并不重要,但对于更复杂的功能,为测试集重置的功能使这变得更容易

每个之前的第一个
$injector
注入函数,您可以使用该函数获取引用。这可以在主
description
功能中完成,因为它们可能不会改变

每个
之前的第二个
我嵌套在一个新的
描述
函数中。然后,您可以创建一组批测试,其中每个
it
都保证有一个新的/新的控制器实例

如果
$injector
为空或未定义,则表示脚本未加载或加载顺序错误。为了更好地解决这一问题,您需要了解注入失败的原因,因为Angular还没有意识到这一点,在这种情况下,请像您在文章顶部开始的那样,用完整的消息/url进行评论,然后我们可以按正确的顺序放置引用

控制器文件

/// <reference path="jquery-2.1.1.min.js" />
/// <reference path="angular.min.js" />
... rest of your code
/// <chutzpah_reference path="angular.min.js"/>
/// <chutzpah_reference path="angular-mocks.js"/>
// you might need additional chutzpah_reference but it really depends on your chutzpah configuration found in chutzpah.json
/// <reference path="jquery-2.1.1.min.js" />
/// <reference path="angular.min.js" />
/// <reference path="angular-mocks.js" />
/// <reference path="jasmine.js" />
/// <reference path="SampleController.js" />

describe('Controller Unit Test: ', function () {
    var $rootScope;  //, $timeout;
    var someServiceMock;

    beforeEach(function () {
        angular.mock.module("app"); // mock your module
    });

    // setup
    beforeEach(inject(function ($injector) {
        someServiceMock = jasmine.createSpyObj('someService', ['someAsyncCall']);
        someServiceMock.someAsyncCall.andReturn($q.when('weee'));

        var $rootScope = $injector.get("$rootScope");
        // $timeout = $injector.get("$timeout"); // not used anywhere that I can see
    }));

    describe('this will executes initial some set of tests on your controller', () => {
        var scope;
        var ctrl;
        beforeEach(inject(function ($controller) {
            scope = $rootScope.$new();
            ctrl = $controller('SampleController', {
                $scope: scope,
                someService: someServiceMock});
        }));

        it('Controller exists', function () {
            expect(scope).toBeDefined();
            expect(ctrl).toBeDefined();
        });
    });
});
//
/// 
... 代码的其余部分
单元测试文件

/// <reference path="jquery-2.1.1.min.js" />
/// <reference path="angular.min.js" />
... rest of your code
/// <chutzpah_reference path="angular.min.js"/>
/// <chutzpah_reference path="angular-mocks.js"/>
// you might need additional chutzpah_reference but it really depends on your chutzpah configuration found in chutzpah.json
/// <reference path="jquery-2.1.1.min.js" />
/// <reference path="angular.min.js" />
/// <reference path="angular-mocks.js" />
/// <reference path="jasmine.js" />
/// <reference path="SampleController.js" />

describe('Controller Unit Test: ', function () {
    var $rootScope;  //, $timeout;
    var someServiceMock;

    beforeEach(function () {
        angular.mock.module("app"); // mock your module
    });

    // setup
    beforeEach(inject(function ($injector) {
        someServiceMock = jasmine.createSpyObj('someService', ['someAsyncCall']);
        someServiceMock.someAsyncCall.andReturn($q.when('weee'));

        var $rootScope = $injector.get("$rootScope");
        // $timeout = $injector.get("$timeout"); // not used anywhere that I can see
    }));

    describe('this will executes initial some set of tests on your controller', () => {
        var scope;
        var ctrl;
        beforeEach(inject(function ($controller) {
            scope = $rootScope.$new();
            ctrl = $controller('SampleController', {
                $scope: scope,
                someService: someServiceMock});
        }));

        it('Controller exists', function () {
            expect(scope).toBeDefined();
            expect(ctrl).toBeDefined();
        });
    });
});
//
/// 
//您可能需要额外的chutzpah_引用,但这实际上取决于chutzpah.json中的chutzpah配置
/// 
/// 
/// 
/// 
/// 
描述('控制器单元测试:',功能(){
变量$rootScope;//,$timeout;
var-someServiceMock;
beforeach(函数(){
angular.mock.module(“app”);//模拟您的模块
});
//设置
每次之前(注入(函数($injector){
someServiceMock=jasmine.createSpyObj('someService',['someAsyncCall']);
someServiceMock.someAsyncCall.andReturn($q.when('weee'));
var$rootScope=$injector.get($rootScope”);
//$timeout=$injector.get($timeout);//在我能看到的任何地方都不使用
}));
description('这将在您的控制器上执行一些初始测试集',()=>{
var范围;
var-ctrl;
每次之前(注入(函数($controller){
scope=$rootScope.$new();
ctrl=$controller('SampleController'{
$scope:scope,
someService:someServiceMock});
}));
它('控制器存在',函数(){
expect(scope.toBeDefined();
expect(ctrl).toBeDefined();
});
});
});
编辑1


更改了引用。添加了角度模拟调用。

尝试这样修改您的测试代码,我还随意修改了您的结构,这样您的测试可能会更有效率。对于较小的控制器/测试,这并不重要,但对于更复杂的功能,为测试集重置的功能使这变得更容易

每个
之前的第一个
$injector
注入函数,您可以使用该函数获取引用。这可以在主
description
功能中完成,因为它们可能不会改变

每个
之前的第二个
我嵌套在一个新的
描述
函数中。然后,您可以创建一组批测试,其中每个
it
都保证有一个新的/新的控制器实例

如果
$injector
为空或未定义,则表示脚本未加载或加载顺序错误。为了更好地解决这一问题,您需要了解注入失败的原因,因为Angular还没有意识到这一点,在这种情况下,请像您在文章顶部开始的那样,用完整的消息/url进行评论,然后我们可以按正确的顺序放置引用

控制器文件

/// <reference path="jquery-2.1.1.min.js" />
/// <reference path="angular.min.js" />
... rest of your code
/// <chutzpah_reference path="angular.min.js"/>
/// <chutzpah_reference path="angular-mocks.js"/>
// you might need additional chutzpah_reference but it really depends on your chutzpah configuration found in chutzpah.json
/// <reference path="jquery-2.1.1.min.js" />
/// <reference path="angular.min.js" />
/// <reference path="angular-mocks.js" />
/// <reference path="jasmine.js" />
/// <reference path="SampleController.js" />

describe('Controller Unit Test: ', function () {
    var $rootScope;  //, $timeout;
    var someServiceMock;

    beforeEach(function () {
        angular.mock.module("app"); // mock your module
    });

    // setup
    beforeEach(inject(function ($injector) {
        someServiceMock = jasmine.createSpyObj('someService', ['someAsyncCall']);
        someServiceMock.someAsyncCall.andReturn($q.when('weee'));

        var $rootScope = $injector.get("$rootScope");
        // $timeout = $injector.get("$timeout"); // not used anywhere that I can see
    }));

    describe('this will executes initial some set of tests on your controller', () => {
        var scope;
        var ctrl;
        beforeEach(inject(function ($controller) {
            scope = $rootScope.$new();
            ctrl = $controller('SampleController', {
                $scope: scope,
                someService: someServiceMock});
        }));

        it('Controller exists', function () {
            expect(scope).toBeDefined();
            expect(ctrl).toBeDefined();
        });
    });
});
//
/// 
... 代码的其余部分
单元测试文件

/// <reference path="jquery-2.1.1.min.js" />
/// <reference path="angular.min.js" />
... rest of your code
/// <chutzpah_reference path="angular.min.js"/>
/// <chutzpah_reference path="angular-mocks.js"/>
// you might need additional chutzpah_reference but it really depends on your chutzpah configuration found in chutzpah.json
/// <reference path="jquery-2.1.1.min.js" />
/// <reference path="angular.min.js" />
/// <reference path="angular-mocks.js" />
/// <reference path="jasmine.js" />
/// <reference path="SampleController.js" />

describe('Controller Unit Test: ', function () {
    var $rootScope;  //, $timeout;
    var someServiceMock;

    beforeEach(function () {
        angular.mock.module("app"); // mock your module
    });

    // setup
    beforeEach(inject(function ($injector) {
        someServiceMock = jasmine.createSpyObj('someService', ['someAsyncCall']);
        someServiceMock.someAsyncCall.andReturn($q.when('weee'));

        var $rootScope = $injector.get("$rootScope");
        // $timeout = $injector.get("$timeout"); // not used anywhere that I can see
    }));

    describe('this will executes initial some set of tests on your controller', () => {
        var scope;
        var ctrl;
        beforeEach(inject(function ($controller) {
            scope = $rootScope.$new();
            ctrl = $controller('SampleController', {
                $scope: scope,
                someService: someServiceMock});
        }));

        it('Controller exists', function () {
            expect(scope).toBeDefined();
            expect(ctrl).toBeDefined();
        });
    });
});
//
/// 
//您可能需要额外的chutzpah_引用,但这实际上取决于chutzpah.json中的chutzpah配置
/// 
/// 
/// 
/// 
/// 
描述('控制器单元测试:',功能(){
变量$rootScope;//,$timeout;
var-someServiceMock;
beforeach(函数(){
angular.mock.module(“app”);//模拟您的模块
});
//设置
每次之前(注入(函数($injector){
someServiceMock=jasmine.createSpyObj('someService',['someAsyncCall']);
someServiceMock.someAsyncCall.andReturn($q.when('weee'));
var$rootScope=$injector.get($rootScope”);
//$timeout=$injector.get($timeout);//在我能看到的任何地方都不使用
}));
description('这将在您的控制器上执行一些初始测试集',()=>{
var范围;
var-ctrl;
每次之前(注入(函数($controller){
scope=$rootScope.$new();
ctrl=$controller('SampleController'{
$scope:scope,
someService:someServiceMock});
}));
它('控制器存在',函数(){
expect(scope.toBeDefined();
expect(ctrl).toBeDefined();
});
});
});
编辑1


更改了引用。添加了角度模拟调用。

在顶部单元测试文件的引用列表中,没有对控制器文件的引用。顺序也很重要,请确保它是引用的最后一个文件。对不起,它在那里,但我把它拔出来是为了尝试。我还是会犯同样的错误你没有推荐人