Тестирование класса со статической зависимостью класса / метода - PullRequest
9 голосов
/ 11 сентября 2010

Итак, у меня есть класс, который выглядит так:

public class MyClassToTest()
{
    MyStaticClass.DoSomethingThatIsBadForUnitTesting();
}

и статический класс, который выглядит следующим образом:

public static class MyStaticClass()
{
    public static void DoSomethingThatIsBadForUnitTesting()
    {
        // Hit a database
        // call services
        // write to a file
        // Other things bad for unit testing
    }
}

(Очевидно, это глупый пример)

Итак, я знаю, что второй класс обречен, когда речь идет о модульном тестировании, но есть ли способ отсоединить класс MyClassToTest, чтобы я мог его протестировать (БЕЗ создания экземпляра MyStaticClass). По сути, я бы хотел, чтобы он игнорировал этот вызов.

Примечание. К сожалению, это проект Compact Framework, поэтому нельзя использовать такие инструменты, как Moles и Typemock Isolator: (.

1 Ответ

12 голосов
/ 11 сентября 2010

Определите интерфейс, который делает то же самое, что и DoSomethingThatIsBadForUnitTesting, например:

public interface IAction {
    public void DoSomething();
}

(Очевидно, что в реальном коде вы бы выбрали лучшие имена.)

Тогдавы можете написать простую оболочку для класса для использования в производственном коде:

public class Action : IAction {
    public void DoSomething() {
        MyStaticClass.DoSomethingThatIsBadForUnitTesting();
    }
}

В MyClassToTest вы передаете экземпляр IAction через его конструктор и вызываете метод для этого экземпляра вместостатический класс.В рабочем коде вы передаете конкретный класс Action, поэтому код ведет себя как прежде.В модульном тесте вы передаете фиктивный объект, который реализует IAction, либо с использованием фиктивного фреймворка, либо с использованием собственного макета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...