Я думаю, что вы, возможно, немного неправильно поняли.
Статические методы являются тестируемыми. Возьмите этот метод в качестве примера:
public static int Add(int x, int y)
{
return x + y;
}
Вы можете проверить это, проверив, что возвращаемое значение соответствует ожидаемому на основании переданных аргументов.
Когда статические методы становятся проблематичными при тестировании, это когда вам нужно ввести макет.
Допустим, у меня есть некоторый код, который вызывает статический метод File.Delete()
. Чтобы протестировать мой код, не полагаясь на файловую систему, я хотел бы заменить / смоделировать этот вызов тестовой версией, которая просто проверяет, что он был вызван из тестируемого кода. Это легко сделать, если бы у меня был экземпляр объекта, для которого вызывался Delete()
. Большинство (все?) Фреймворк-фреймворков не может имитировать статические методы, поэтому использование статического метода в моем коде вынуждает меня тестировать его по-другому (обычно путем вызова реального статического метода).
Чтобы протестировать что-то подобное, я бы представил интерфейс:
interface IFileDeleter
{
void Delete(string file);
}
Мой код будет тогда брать экземпляр объекта, который реализует этот интерфейс (либо в вызове метода, либо в качестве параметра в конструкторе), а затем вызывать его метод Delete()
, чтобы выполнить удаление:
void MyMethod(string file)
{
// do whatever...
deleter.Delete(file);
}
Чтобы проверить это, я могу сделать макет интерфейса IFileDeleter
и просто проверить, что был вызван его метод Delete()
. Это устраняет необходимость иметь настоящую файловую систему как часть теста.
Может показаться, что код более сложный (какой он есть), но он окупается, делая его намного проще для тестирования.