2013-09-10 58 views
10

我有一个服务'Inputs',在模块'Puts'中定义,依赖于第二个服务'InputCreator'。我需要存根InputCreator服务才能测试Inputs服务。注入模拟角度服务依赖关系

据我了解answer here,我应该创建一个包含我的存根服务的模块,然后创建一个新的'测试'模块,指定被测模块,然后将存根模块指定为依赖关系。然后从注射器中提取服务。就像这样: ' - 输入未知InputsProvider <'

beforeEach(function() { 

    angular.module.('Puts'); // contains the service 'Inputs' 

    angular.module('Mocks',[]) 
    .service('InputCreator',function(){ 
     var mockInputs = { 
     //stubbed behaviour goes here 
     }; 
     return mockInputs; 
    }); 
    }); 

    angular.module('Test',['Puts', 'Mocks']; 

    inject(function($injector){ 
    Inputs = $injector.get('Inputs'); 
    }); 
}); 

然而,喷油器功能与响应。

我哪里迷路了?

谢谢!

回答

21

想通了,我想我会回答我自己的问题。上面的大错误是使用angular.module而不是angular.mock.module,这是通过angular-mock作为模块引用的便利。他们根本不是一回事!

此外,只要在初始化待测模块之前进行初始化,就可以使用angular.mock.module初始化模拟服务。没有必要像上面链接的问题中所建议的那样,将这些模块封装在第三个模块中。即:

describe("Test Service", function() { 
    var TestService, getvaluestub; 

    beforeEach(function() { 

    // create mock service 
    var mock = {getvalue:function(){}} 

    angular.module('dependencymodule',[]) 
     .service('dependencyservice',function() { 
     return mock; 
     }); 

    //mock the function we are stubbing, (that, in this case, returns value 4) 
    getvaluestub = sinon.stub(mock,'getvalue')returns(4); 

    //instantiate your mock service 
    module('dependencymodule'); 

    //instantiate the module of the service under test, 
    //that depends on 'dependencyservice' mocked above 
    //(ie - testmodule includes the  service 'testservice') 
    module('testmodule'); 

    //inject your test service for testing 
    inject(function ($injector) { 
     TestService = $injector.get('testservice'); 
    }) 

    //tests go here..... 

如果相关模块已经存在,你既可以依然做到以上的,或者你可以获取从$喷油器的服务,将您的间谍和存根,以及>然后<实例化被测服务。间谍/存根的设置> <的依赖服务实例化之前很重要,否则它将在没有它们的情况下被实例化。它看起来像这样:

describe("Test Service", function() { 
    var TestService, DependencyService, getvaluestub; 

    beforeEach(function() { 

    // these modules are specified in the application 
    module('dependencymodule'); 
    module('testmodule'); 

    inject(function ($injector) { 
     DependencyService = $injector.get('testservice'); 

     getvaluestub = sinon.stub(DependencyService,'getvalue').returns(4); 

     OtherService = $injector.get('otherservice'); 
    }) 
    }); 

// test go here 

所以,你去了。希望这对搜索'将模拟注入角度服务'的人有用。

+0

非常感谢您的支持!以下是使用存根进行服务测试服务,控制器和过滤器的另一个示例。 https://gist.github.com/clouddueling/11188718 –