
You don't inject for tests - persei8
http://blog.arkency.com/2013/01/you-dont-inject-for-tests/
======
wyuenho
I think we are starting to argue about semantics here. This example is simply
a very common way of coding to an interface, which BTW, duck-typing makes this
so much easier.

I think through out the whole discussion about DI in the past week or so is
that people don't talk about the injectors themselves enough. Too many pseudo-
experts talking about inconsequential and totally unrelated programming
principles and paradigms.

I don't think people naturally object to coding to the interface, which this
example illustrates very well its utility. I think detractors simply just hate
the injectors, the people who use the bad injectors indiscriminately, and the
stubborn people who insist on doing DI on an entire app.

My guess is, most people automatically jump to a DI framework not really
because of DI, you can do DI with just a good old factory and may be a good
configuration library. Most people jump to DI because of a framework, and the
niceties that said framework offers. After a while, people just start
confusing the effect with the cause.

Can we please start talking about what is DI, when would one find it useful,
and what DI approach is suitable under what circumstances now?

------
RyanZAG
Can someone not work out a way to 'unit test' dependency injection vs other
methods so we have some facts to compare? These discussions feel like people
arguing with each other over which color is the best, with everyone chiming in
with random anecdotes and feelings.

Red must be the best - it goes the fastest!

------
btilly
Let me turn this around.

In a dynamic language, unit testing is a bad reason to use dependency
injection. There are lots of valid reasons to use it. But you don't need it
for unit testing.

Returning to DHH's example, if you just want to get the current time in Ruby
code, just get it. You can use the dynamic nature of the language to stub that
out and unit test it. But you don't need to use dependency injection to enable
that. And you really don't need to use a heavy framework.

If you have a different reason to use dependency injection, though, by all
means go ahead.

------
zby
It's like removing magic constants from business logic into config files :)

~~~
andrzejkrzywda
Yeah, I was thinking about this recently. All of the "good patterns" turn your
code into data. At the end it's more of declaring than coding the logic.

------
fideloper
I "discovered" DI when learning about Unit Testing, but the benefits to
maintainability were obvious from the get-go.

I'm not sure many people argued that it wasn't about maintainability. I'd say
they just ignored that part of the argument.

The best explanations of Unit Tests I've seen also explain how it helps
improve maintainability, so perhaps that's why Unit Testing and
Maintainability has always gone hand-in-hand in my thinking.

------
mimog
I test to verify that my code works.. Why would unit test show me where object
orientation breaks down?

~~~
andrzejkrzywda
When things are hard to unit test, it might be a smell that there is something
wrong with your OOP code.

~~~
mimog
But that's why you start by writing the tests and then evolve the test and the
production code in parallel, so that you don't end up with code that is hard
to test. I don't think that just because something is testable means that the
design incorporates good OO practices.

------
franzwong
It would be quite hard to draw a straight line to separate goals of software
creation and maintenance.

------
martinced
No need to read such a post...

Title says: _"You don't inject for tests"_

And, before opening the link, you know what you're going to find.

Someone confusing "testing" and "unit testing".

First thing that came to my mind (while reading the header on HN) was _"There
are several kind of testing..."_ but... Curiosity killed the cat. Let's open
the link.

Ouch, first sentence:

 _"What is unit testing for?"_

OK, closed.

Don't waste your time reading this crap ; )

~~~
jordan0day
I'm not sure I understand what you're so upset about?

"Don't waste your time reading this crap" because of some imprecise verbiage?

According to the typical "testing pyramid", unit testing should be _the most
common_ type of testing done -- is it really so unforgivable that someone
would use a general term (test) for what they do most often (unit test)?

