Javascript 如何模拟ember注入的属性';国际奥委会
我正在寻找,如何模拟ember的ioc容器注入的属性。目标是单元测试一个类。 例如,我想测试一个具有许多注入属性的控制器,我可以在它的容器中注入一些“controller:NAME”来模拟所需的控制器,但是如何模拟其余的控制器呢?请查看以上代码以了解:Javascript 如何模拟ember注入的属性';国际奥委会,javascript,unit-testing,ember.js,Javascript,Unit Testing,Ember.js,我正在寻找,如何模拟ember的ioc容器注入的属性。目标是单元测试一个类。 例如,我想测试一个具有许多注入属性的控制器,我可以在它的容器中注入一些“controller:NAME”来模拟所需的控制器,但是如何模拟其余的控制器呢?请查看以上代码以了解: //===================================== // Source : //===================================== App = Ember.Application.create
//=====================================
// Source :
//=====================================
App = Ember.Application.create();
App.ApplicationController = Ember.Controller.extend({
});
App.IndexController = Ember.Controller.extend({
needs:["application"]
});
App.Session = Em.Object.extend({
isAlive:true
});
Em.Application.initializer({
name: "ioc",
initialize: function(container, application) {
container.register('session:instance', App.Session);
container.optionsForType('session', { singleton: true });
// inject session in all controllers
container.typeInjection('controller', 'session', 'session:instance');
}
});
//=====================================
// Test :
//=====================================
App.setupForTesting();
(function(){
var container, indexCtrl, session;
module('Test suite',{
setup:function(){
container = new Em.Container();
container.register('session:instance', Em.Object, {singleton:true});
container.register('controller:index', App.IndexController);
container.register('controller:application', Em.Object);
indexCtrl = container.lookup('controller:index');
session = container.lookup('session:instance');
}
});
test('IndexController IOC tests',function(){
ok(indexCtrl.get('controllers.application') !== undefined,
"ApplicationController should not be undefined");
ok(indexCtrl.get('session') !== undefined,
"Session should not be undefined");
});
})();
在此处提供的运行演示中:
您可以看到“session”属性没有正确模拟,并且没有定义。在测试中使用您的应用程序容器
setup: function() {
App.reset();
indexCtrl = App.__container__.lookup('controller:index')
};
应用重置将重置容器,并在每次调用时运行所有初始化。因此,这将为您提供一个原始版本的控制器,并注入所有依赖项
您还可以在测试运行时使用模拟容器创建控制器
setup: function() {
container = new Em.Container();
container.register('session:instance', Em.Object, {singleton:true});
container.register('controller:application', Em.Object);
indexCtrl = App.IndexController.create({ container: container });
session = container.lookup('session:instance');
};
我写了一篇关于单元测试控制器的文章,以及在测试期间注入和模拟依赖项的一些方法。您可以在这里阅读:我很难将您的示例应用到测试服务中。你能举一个例子来测试一个注入了另一个依赖项(在我的例子中是另一个服务)的服务吗?