0

我正在为我的AngularJS应用程序的控制器创建单元测试。 在myapp.run我注射和使用的工厂,叫UsersFactory,在某种程度上是这样的:当用Jasmine测试时,全局注入AngularJS工厂样机

myApp.run(['$rootScope','UsersFactory', function ($rootScope,UsersFactory) { 
    UsersFactory.getMe().then(function(data) 
    { 
     //.. 
    }); 
}]); 

我创建了一个模拟的UsersFactory称为UsersFactoryMock。它与UsersFactory有相同的方法,但是实现当然是不同的(假的)。

我想注入UsersFactoryMock,以便能够myApp.run使用它而不是UsersFactory。

我试图这样做使用beforeEach:

beforeEach(module(function ($provide, $injector) 
{ 
    $provide.service("UsersFactory", $injector.get("UsersFactoryMock")); 
})); 

但运行测试,它告诉我,

Error: [$injector:modulerr] Failed to instantiate module function ($provide) due to: ReferenceError: UsersFactoryMock is not defined"

我怎么能实现我的目标是什么?

在此先感谢。

回答

0

UsersFactoryMock是否需要注册注射器?为什么不只是提供一个简单的对象作为 你的模拟?

var UsersFactoryMock = { 
    getMe: function() { 
     // mocked method 
    } 
}; 

beforeEach(module(function ($provide) { 
    $provide.service("UsersFactory", UsersFactoryMock); 
})); 

此外,运行块中的测试代码通常是混乱的。你应该将这样的逻辑转变成一种服务,然后可以像其他任何一种服见:https://stackoverflow.com/a/18089426/2943490

+0

如果我的模拟对象有依赖关系? – 2014-12-12 14:38:19

+0

我认为这是试图测试太多。模拟的重点不在于重建原始实现,而是让您测试依赖于模拟出的模块的代码,而不用担心它的内部实现。 – user2943490 2014-12-12 22:27:09