То, что я делаю, - это использование существующего статического класса в качестве шва и предоставление альтернативной реализации в другом пространстве имен.Это означает, что вы можете получить тестируемый код с минимальным количеством изменений - просто изменения пространства имен.Обычно мне приходилось делать это, чтобы обойти операции с файловой системой 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
...
}
Недавно я написал блог с некоторыми подробностями здесь .