Какова наилучшая практика рефакторинга статического метода для того, чтобы сделать его более тестируемым?

Какова наилучшая практика рефакторинга статического метода для того, чтобы сделать его более тестируемым?
Какова наилучшая практика рефакторинга статического метода для того, чтобы сделать его более тестируемым? - jcotten @ Unsplash

Это действительно зависит от того, что такое 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 код отдельно от его зависимостей.

Прикрепляю к посту несколько видео по теме:

Прикрепленное видео 1 - QIWI Server Party 4.0


LetsCodeIt, 22 мая 2023 г., 23:40