Это действительно зависит от того, что такое Bar
. Если это что-то простое, то ваш метод Foo
уже можно протестировать, вам просто нужно указать свои ожидания и вызвать его статически, например:
Assert.IsTrue( FooContainer.Foo() );
Но если Bar
инкапсулирует, скажем, уровень доступа к вашей базе данных, то вы не сможете протестировать Foo
без реальной базы данных, поэтому (спасибо @ysolik) статические методы — смерть для тестируемости . Или, по словам Майкла Фезерса, « не прячьте TUF в TUC» (TUF обозначает недружественную к тестированию функцию, TUC обозначает недружественную к тестированию конструкцию). Если Bar
действительно не подходит для тестирования, то, извините, он не работает без создания Foo
метода экземпляра. Сначала вам нужно будет изменить код:
public class FooContainer {
public bool Foo() {
var bar = new Bar();
//...
}
}
Когда Foo
больше не является статическим, вы можете вызвать его для экземпляра FooContainer
:
var container = new FooContainer();
Assert.IsTrue( container.Foo() );
Следующий шаг — извлечь интерфейс из Bar
(назовем его IBar
) и внедрить его в FooContainer
:
public class FooContainer {
private readonly IBar m_bar;
public FooContainer( IBar bar ) { m_bar = bar; }
public bool Foo() {
// don't create another Bar, use m_bar
}
}
Теперь вы можете mock/stub IBar
с вашим любимым изолирующим фреймворком и тестировать FooContainer
код отдельно от его зависимостей.
Прикрепляю к посту несколько видео по теме: