- Classes are more modular, as they depend only on the interface of passed-in dependencies. Class behavior can be changed by swapping out a new component.
- Testing is simplified, since stubs can be substituted for any dependency.
- It's harder to understand how a class works when reading just that class. You may have to track down its invocation to see what kind of components are passed in.
- Is DepedencyClass.expects(:new).returns(stub)) a smell, since we should have injected that stub to the class that uses it instead?
- If a class uses DI, should one only pass in already-instantiated dependencies, or is it okay to let the calling class instantiate them?
- Am I missing any pros or cons?
Not sure this makes any sense or is useful for your case, but in our travis codebase I found using "fat factories" useful: https://github.com/travis-ci/travis-build/blob/master/lib/travis/build/factory.rb#L7-19. These factories are (more or less) the only places where knowledge about classes and instantiation is centralized. The factories themselves are used through convenience methods as in https://github.com/travis-ci/travis-build/blob/master/lib/travis/build.rb#L39-41