Если у вас уже есть код и вы спрашиваете, как его протестировать, вы сначала не пишете свои тесты ... так что на самом деле не делаете TDD.
Однако у вас есть зависимость. Таким образом, подход TDD состоял бы в использовании Dependency Injection. Это можно сделать проще с помощью контейнера IoC, например Unity.
При выполнении TDD «правильно», ваши мыслительные процессы должны работать следующим образом в этом виде сценария:
- мне нужно сделать
Foo
- Для этого я буду опираться на внешнюю зависимость, которая будет реализовать интерфейс (новый или уже существующий) из
IMyDisposableClass
- Поэтому я инжектировать
IMyDisposableClass
в класс, в котором Foo
объявляется с помощью своего конструктора
Затем вы должны написать один (или более) тесты, которые не пройдут, и только тогда вы были бы в том месте, где вы писали тело функции Foo
, и определить, нужно ли вам использовать блок using
.
В действительности вы вполне можете знать, что да, вы будете использовать блок using
. Но часть точки TDD заключается в том, что вам не нужно беспокоиться об этом, пока не доказали (через тесты), что вам нужно использовать объект, который этого требует.
После того, как вы определили, что вам нужно использовать using
блок вы бы тогда хотите написать тест, который не - например, используя что-то вроде Rhino Mocks установить ожидание того, что Dispose
будет вызван на макете объекта, который реализует IMyDisposableClass
,
Например (используя Rhino Mocks для издевки 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();
}
Что такое TDD?Единственное расширение, о котором я знаю, - это Test-Driven Development. –
Это тестовое развитие. – Vadim
Итак, ваш вопрос: «Как я могу тестировать разработку, как код выше?» –