Если у вас уже есть свой код и вы спрашиваете, как его протестировать, значит, вы не пишете свои тесты первыми ... так что на самом деле не делаете TDD.
Однако у вас есть зависимость. Таким образом, подход TDD будет использовать Dependency Injection . Это можно упростить с помощью контейнера IoC , например Unity .
При выполнении TDD «должным образом» ваши мыслительные процессы должны работать следующим образом в этом сценарии:
- Мне нужно сделать
Foo
- Для этого я буду полагаться на внешнюю зависимость, которая будет реализовывать интерфейс (новый или уже существующий)
IMyDisposableClass
- Поэтому я добавлю
IMyDisposableClass
в класс, в котором Foo
объявлен через его конструктор
Затем вы напишете один (или несколько) тестов, которые не пройдут, и только тогда вы окажетесь в точке, где вы писали тело функции Foo
, и определите, нужно ли вам использовать блок using
.
На самом деле вы вполне можете знать, что да, вы будете использовать using
блок. Но отчасти TDD заключается в том, что вам не нужно беспокоиться об этом, пока вы не докажете (с помощью тестов), что вам действительно нужно использовать объект, который требует этого.
После того, как вы определили, что вам нужно использовать блок using
, вы захотите написать тест, который не удался - например, используя что-то вроде Rhino Mocks , чтобы установить ожидание, что Dispose
будет вызван для фиктивного объекта, который реализует IMyDisposableClass
.
Например (использование насмешек Rhino для насмешки 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());
}
}
Класс, в котором существует ваша функция Foo, с IMyDisposableClass
, внедренным как зависимость:
public class Stuff
{
private readonly IMyDisposableClass _client;
public Stuff(IMyDisposableClass client)
{
_client = client;
}
public bool Foo()
{
using (_client)
{
return _client.SomeOtherMethod();
}
}
}
И интерфейс IMyDisposableClass
public interface IMyDisposableClass : IDisposable
{
bool SomeOtherMethod();
}