Ruby on rails RubyonRails——依赖注入难题

Ruby on rails RubyonRails——依赖注入难题,ruby-on-rails,ruby,unit-testing,dependency-injection,ruby-on-rails-2,Ruby On Rails,Ruby,Unit Testing,Dependency Injection,Ruby On Rails 2,我正在开发一个Rails2应用程序,缺少依赖注入容器让我想知道依赖项及其对单元测试的影响。我有以下资料: 控制器 def some_action object_a = ClassA.new object_a.do_something end 甲级 def do_something # some code, then... object_b = ClassB.new(params) end 因为ClassA的do_something方法实例化了object_b,所以我无法在单元

我正在开发一个Rails2应用程序,缺少依赖注入容器让我想知道依赖项及其对单元测试的影响。我有以下资料:

控制器

def some_action
  object_a = ClassA.new
  object_a.do_something
end
甲级

def do_something
  # some code, then...
  object_b = ClassB.new(params)
end
因为ClassA的do_something方法实例化了object_b,所以我无法在单元测试中模拟object_b的行为。解决方法是将初始化参数从控制器传递到ClassA,然后在ClassA的initialize中,我可以为ClassB传递所需的参数

然而,通过这样做,我向控制器公开了它不需要知道的关于ClassB的知识(它是init参数)


想法?

您不需要ruby中的所有DI内容。你有元编程,所有的测试框架都实现了所需的模拟和存根?哇,那一定是一段很老的代码……那么尽可能多地隔离依赖关系呢?这就是DI容器最有帮助的地方。通常答案是,在ruby中不需要它。虽然将软件设计为注入依赖项是一个很好的最佳实践,但由于元编程的原因,在ruby中完全没有必要这样做。在像ruby这样的动态开放语言中有许多不同的范例。在考虑di容器之前,先学习它们。我建议您阅读Ruby中的设计模式。您不需要Ruby中的所有DI内容。你有元编程,所有的测试框架都实现了所需的模拟和存根?哇,那一定是一段很老的代码……那么尽可能多地隔离依赖关系呢?这就是DI容器最有帮助的地方。通常答案是,在ruby中不需要它。虽然将软件设计为注入依赖项是一个很好的最佳实践,但由于元编程的原因,在ruby中完全没有必要这样做。在像ruby这样的动态开放语言中有许多不同的范例。在考虑di容器之前,先学习它们。我建议阅读Ruby中的设计模式。