UnitTesting статический класс (теоретический вопрос) - PullRequest
0 голосов
/ 06 сентября 2011

Я знаю, когда можно использовать статический класс, но мой простой вопрос:

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

Лучше просто использовать класс обычных экземпляров?

Спасибо (я знаю, что есть некоторые вопросы, которые говорят об этом, но все они основаны на конкретном случае, я просто хочу иметь общее мнение об этом)

1 Ответ

0 голосов
/ 07 октября 2011

То, что я делаю, - это использование существующего статического класса в качестве шва и предоставление альтернативной реализации в другом пространстве имен.Это означает, что вы можете получить тестируемый код с минимальным количеством изменений - просто изменения пространства имен.Обычно мне приходилось делать это, чтобы обойти операции с файловой системой C # - File.Exists и т. Д.

Скажем, ваш метод в основном делает это:

using System.IO;

public void SomeMethod()
{
    ...
    if(File.Exists(myFile))
    {
        ...
    }
    ...
}

, тогда я бы заменил эту реализациюфайла с альтернативой.Альтернативная реализация должна заглушить любые существующие методы и сделать вызовы для делегирования реализаций под прикрытием - например,

namespace IO.Abstractions 
{     
    public static class File
    {         
        public static Func<string, string, string> ExistsImpl =
                                                      System.IO.File.Exists;

        public static string Exists(string path)
        {             
            return ExistsImpl (path);
        }
    }
} 

Затем я бы изменил исходный код, чтобы он использовал новое пространство имен:

using IO.Abstractions;

public void SomeMethod()
{
    ...
    if(File.Exists(myFile))
    {
        ...
    }
    ...
}

Затем в своем тесте вы можете просто предоставить альтернативную реализацию поведения для File.Exists, что-то вроде:

[Test]
public void SomeTest()
{
    // arrange
    ...
    File.ExistsImpl = (path) => true; // to just default to true for every call
    ...

    // act
    someClass.SomeMethod();

    // then assert
    ...
}

Недавно я написал блог с некоторыми подробностями здесь .

...