AngularJS:在测试中注入导致错误

时间:2015-03-02 04:41:48

标签: angularjs karma-jasmine

我无法在测试中使用inject

angularangular-mocks都是version 1.3.14

我完全迷失在这里。任何想法将不胜感激!

这会导致错误:

describe("factory: Account", function () {

    var $httpBackend;
    var $rootScope;
    var Account;

    beforeEach(module('app'));

    beforeEach(inject(function() {
        // $httpBackend = _$httpBackend_;
    }));


    it("Should fetch account", function() {
    });
});

但如果我删除注入它将通过:

describe("factory: Account", function () {

    var $httpBackend;
    var $rootScope;
    var Account;

    beforeEach(module('app'));

    beforeEach(function() {
        // $httpBackend = _$httpBackend_;
    });


    it("Should fetch account", function() {
    });
});

在Gruntfile.js中:

    karma: {
        unit: {
            options: {
                frameworks: ['jasmine'],
                singleRun: true,
                browsers: ['Safari'],
                files: [
                    'bower_components/angular/angular.js',
                    'bower_components/angular-mocks/angular-mocks.js',
                    'bower_components/moment/moment.js',
                    'bower_components/ckeditor/ckeditor.js',
                    'bower_components/ng-ckeditor/ng-ckeditor.min.js',
                    'app/app.js',
                    'app/**/*.js',
                ]
            }
        }
    }

以下是测试的输出:

Safari 8.0.5 (Mac OS X 10.10.3) factory: Account Should fetch account FAILED
    /.../bower_components/angular/angular.js:63:32
    /.../bower_components/angular/angular.js:4120:30
    forEach@/.../bower_components/angular/angular.js:323:24
    loadModules@/.../bower_components/angular/angular.js:4081:12
    createInjector@/.../bower_components/angular/angular.js:4007:22
    workFn@/.../bower_components/angular-mocks/angular-mocks.js:2353:60

4 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。这也是一个依赖性问题,比如@ user2755599,这篇文章https://stackoverflow.com/a/37946833/2908670帮助了我。

基本上,PhantomJS可能会隐藏错误消息。切换到Chrome等浏览器以运行测试以获取更多信息。

答案 1 :(得分:1)

我认为你应该这样写:

describe("factory: Account", function () {
    var $httpBackend;
    var $rootScope;
    var Account;

    beforeEach(module('app'));

    beforeEach(function(_$httpBackend_) {
         $httpBackend = _$httpBackend_;
    });

    it("Should fetch account", function() {
    });
});

在使用之前,您需要声明$httpBackend

答案 2 :(得分:0)

如果您删除了注入,它会起作用,因为基本上它没有做任何事情。

您需要注入,$httpBackend应作为包含在下划线中的参数传递:

describe("factory: Account", function () {

    var $httpBackend;
    var $rootScope;
    var Account;

    beforeEach(module('app'));

    beforeEach(inject(function(_$httpBackend_) {
        $httpBackend = _$httpBackend_;
    }));


    it("Should fetch account", function() {
    });
});

答案 3 :(得分:0)

对我来说,这个问题仅仅是因为加载角度模拟两次。

该项目是使用Browserify编写的,原始开发人员在vendor.js包中包含了模拟,并通过它的配置将其加载到Karma中。一旦我从捆绑中移除了模拟并且只让Karma加载它,我就很高兴。