Jasmine未知提供商中的Angular Mocking

时间:2016-03-25 12:55:59

标签: angularjs jasmine karma-jasmine

我无法让这两个规范文件相互配合。我并不认为spec文件会影响其他spec文件,但在这种情况下它看起来像是这样,对我来说毫无意义。

我使用 Jasmine Karma ,测试通过 Gulp 自动执行 我得到的错误是 "未知提供商:ProductServiceProvider< - ProductService"

我已经更改了测试以解决问题,这里是简单的版本。

如果我注释掉文件2中的以下行,则两个文件都会通过。

angular.module('eu.product.service', []);

这与模拟模块有关,但我无法弄清楚我在这里做错了什么。

spec file 1

describe('Testing euProduct', function(){

var $factory;
var $httpBackend;

beforeEach(function () {

    //modules
    module('eu.product.service');

    //injections
    inject(function($injector){
        $factory = $injector.get('ProductService');
        $httpBackend = $injector.get('$httpBackend');
    });

    //mock data
    $httpBackend.when('GET', '/Mercury/product/list/0/0?PrimaryCategoryID=0&pageSize=20&startPage=1').respond({
        "data":
            [{
                "recallid":45,
            }]
    });

});

afterEach(function() {
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
});
//-----Tests----

it('Should be able to get data from the server on default parameters.', function(){
    $factory.list({},function(data){
        expect(data.data[0].recallid).toBe(45);
    });
    $httpBackend.flush();
});

});

规范文件2

'use strict';

描述('测试euProduct Logic',function(){

//variables in closure scope so they can be used in tested but set with injection in beforeEach
var $factory;

//mocking a module :: http://www.sitepoint.com/mocking-dependencies-angularjs-tests/
beforeEach(function () {
    angular.module('eu.product.service',[]);

    module(function($provide) {
        $provide.factory('ProductService', function() {
            // Mocking utilSvc
            return {
                list : function(para, callback){
                    callback({
                        data : {
                            product : 'The product Name'
                        }
                    })
                }
            };
        });

        $provide.service('storageSvc', function() {
            // Mocking storageSvc
        });
    });

    //modules
    module('eu.product.logic');

    //injections
    inject(function($injector){
        $factory = $injector.get('ProductLogic');
    });

});

//-----Tests----

it('Should be able to run tests', function(){
    expect(2).toBe(2);
});
});

1 个答案:

答案 0 :(得分:1)

来自module的{​​{1}}和inject都返回需要调用的函数。

在以下示例中,我进行了以下更改:

  • 重构基本工作示例
  • 不要定义自定义angular-mocks - 前缀变量。这些是由angular保留的。
  • 使用$代替inject注入。
  • 添加一些注释以供进一步说明。

    $injector