Si ya tiene su código y está preguntando cómo probarlo, entonces no está escribiendo sus pruebas primero ... por lo que realmente no está haciendo TDD.
Sin embargo, lo que tiene aquí es una dependencia. Entonces el enfoque TDD sería usar Dependency Injection. Esto puede hacerse más fácil usando un contenedor IoC como Unity.
Al hacer TDD "correctamente", sus procesos de pensamiento deben funcionar de la siguiente manera en este tipo de escenario:
- Necesito hacer un
Foo
- Para esto voy a confiar en una dependencia externa que se implementar una interfaz (nuevo o pre-existentes) de
IMyDisposableClass
- por lo tanto voy a inyectar un
IMyDisposableClass
en la clase en la que Foo
se declara a través de su constructor
Luego escribiría una (o más) pruebas que fallan, y solo entonces estaría en el punto donde estaba escribiendo el cuerpo de la función Foo
, y determinaría si necesitaba usar un bloque using
.
En realidad, es posible que así saber que sí, que va a utilizar un bloque using
. Pero parte del objetivo de TDD es que no debe preocuparse hasta que haya demostrado (mediante pruebas) que necesita usar un objeto que lo requiera.
Una vez que haya determinado que es necesario utilizar un bloque using
usted entonces que desee escribir una prueba que falla - por ejemplo, usando algo como Rhino Mocks para establecer una expectativa de que Dispose
se llamará en un objeto de burla que implementa IMyDisposableClass
.
Por ejemplo (usando Rhino Mocks burlarse IMyDisposableClass
).
[TestFixture]
public class When_calling_Foo
{
[Test]
public void Should_call_Dispose()
{
IMyDisposableClass disposable = MockRepository
.GenerateMock<IMyDisposableClass>();
Stuff stuff = new Stuff(disposable);
stuff.Foo();
disposable.AssertWasCalled(x => x.Dispose());
}
}
clase en la que existe la función Foo, con IMyDisposableClass
inyectada como una dependencia:
public class Stuff
{
private readonly IMyDisposableClass _client;
public Stuff(IMyDisposableClass client)
{
_client = client;
}
public bool Foo()
{
using (_client)
{
return _client.SomeOtherMethod();
}
}
}
Y la interfaz IMyDisposableClass
public interface IMyDisposableClass : IDisposable
{
bool SomeOtherMethod();
}
¿Qué es TDD?La única expansión que conozco es Desarrollo basado en pruebas. –
Es un desarrollo impulsado por prueba. – Vadim
Entonces, su pregunta es "¿Cómo puedo probar el desarrollo de desarrollo algo así como el código anterior?" –