angularjs - 如何使用 Jasmine/karma 正确注入(inject)工厂并进行测试?

标签 angularjs jasmine karma-jasmine

这是我的工厂/base.js:

angular.module("BaseApp", [])
    .config(['$httpProvider', function($httpProvider) {
        $httpProvider.defaults.xsrfCookieName = 'csrftoken';
        $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
    }])

    .config(['$locationProvider', function($locationProvider){
        $locationProvider.html5Mode(true);
    }])

    .factory("BaseService", ["$http", "$window", function($http, $window) {

这是我的test_base.js:

describe('Factory: BaseService', function() {
    var fctry, mockBackend;

    beforeEach(function() {

        module('BaseApp');

        inject(function($factory, $httpBackend) {
            mockBackend = $httpBackend;
            fctry = $factory('BaseService', {});
        });
    });

    it('logout() should POST to /logout', function() {
        // I want to test if the logout(cb) function posts to /logout and, on success, redirect to '/'
        // but on failure, calls accessErrors and the cb.
    });
});

这是我的 karma 配置文件:

files: [
  '../angular.js',
  'node_modules/angular-mocks/angular-mocks.js',

  '../base.js',

  'tests/test_base.js',
],

当我执行 karma start 并运行测试时,我收到此错误/失败:

Chromium 48.0.2564 (Ubuntu 0.0.0) Factory: BaseService logout() should POST to /logout FAILED
    Error: [$injector:unpr] Unknown provider: $factoryProvider <- $factory
    http://errors.angularjs.org/1.3.15/$injector/unpr?p0=%24factoryProvider%20%3C-%20%24factory

...

Chromium 48.0.2564 (Ubuntu 0.0.0): Executed 1 of 1 (1 FAILED) (0 secs / 0.053 secChromium 48.0.2564 (Ubuntu 0.0.0): Executed 1 of 1 (1 FAILED) ERROR (0.114 secs / 0.053 secs)

为什么它已经失败了,为什么它说 $factoryProvider 是一个未知的提供者?

最佳答案

它认为您正在尝试注入(inject)工厂,这是一个函数,而不是提供程序,因此这是行不通的。

您还错过了 underscore trick

尝试更改此设置:

var fctry, mockBackend;
beforeEach(function() {

    module('BaseApp');

    inject(function($factory, $httpBackend) {
        mockBackend = $httpBackend;
        fctry = $factory('BaseService', {});
    });
});

对此:

var BaseService, $httpBackend;
beforeEach(function() {

    module('BaseApp');

    inject(function(_BaseService_, _$httpBackend_) {
        $httpBackend = _$httpBackend_;
        BaseService = _BaseService_;
    });
});

关于angularjs - 如何使用 Jasmine/karma 正确注入(inject)工厂并进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35495664/

相关文章:

javascript - angularJs 形式未正确将对象添加到数组中。 2 路绑定(bind)不起作用

javascript - 使用依赖注入(inject)和 `done` 编写 Karma + Mocha 测试?

javascript - 返回表达式类型 Promise<T> 不能分配给类型 Promise<T>?

javascript - 使用 Jasmine/Karma 测试 AngularJS 1.6 基于类的 Controller

Angular karma Font Awesome - SyntaxError : Invalid or unexpected token

javascript - 使用 Json 填充剑道树

javascript - View 模板中的 Angular 表达式是否会降低 Angular 应用程序的性能

angular - 如何在 Jest 中模拟 router.navigate 方法

javascript - Angular 7 测试 : NullInjectorError: No provider for ActivatedRoute

javascript - Angular 服务中的单元测试 $q promise - Karma、Jasmine