Javascript 如何模拟ember注入的属性';国际奥委会

Javascript 如何模拟ember注入的属性';国际奥委会,javascript,unit-testing,ember.js,Javascript,Unit Testing,Ember.js,我正在寻找,如何模拟ember的ioc容器注入的属性。目标是单元测试一个类。 例如,我想测试一个具有许多注入属性的控制器,我可以在它的容器中注入一些“controller:NAME”来模拟所需的控制器,但是如何模拟其余的控制器呢?请查看以上代码以了解: //===================================== // Source : //===================================== App = Ember.Application.create

我正在寻找,如何模拟ember的ioc容器注入的属性。目标是单元测试一个类。 例如,我想测试一个具有许多注入属性的控制器,我可以在它的容器中注入一些“controller:NAME”来模拟所需的控制器,但是如何模拟其余的控制器呢?请查看以上代码以了解:

//=====================================
// 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');
};

我写了一篇关于单元测试控制器的文章,以及在测试期间注入和模拟依赖项的一些方法。您可以在这里阅读:

我很难将您的示例应用到测试服务中。你能举一个例子来测试一个注入了另一个依赖项(在我的例子中是另一个服务)的服务吗?