В компаниях, где я работал, «издевательства» никогда не видели слишком хорошо.
Обычно написание тестовой реализации работает лучше:
public interface IUploader
{
IResult Upload(string filePath);
}
public sealed class FileUploader
{
IResult Upload(string filePath) { ... } // method is implemented as expected
}
public sealed class TestUploader //this is placed in a specific folder for test implementations
{
public IResult ExpectedResult { get; set; } = Result.Success();
IResult Upload(string filePath) => ExpectedResult;
}
Чтобы связать его с вашим классом, проверьте Шаблон проектирования смиренного объекта . В нем объясняется, как извлечь тестируемые логи c из явно не тестируемых классов.
void UploadToCloud(string filePath)
{
...
Uploader.Upload(filePath); // real implementation in production code, test implementation during unit testing.
...
}
Я бы предпочел пойти по этому пути по нескольким причинам:
- Изменение производственного кода заставляет вас также изменить реализацию теста. При использовании Mock вы рискуете не заметить, что ваши тесты устарели.
- Реализация теста дает вам больше свободы (то есть вы можете передать результат теста реализации теста в части инициализации теста, чтобы проверить крайние случаи).
- Это чище, чем издевается, и другие разработчики могут лучше понять, что происходит. Чем аккуратнее код, тем легче поддерживать его в чистоте.
- У вас все еще есть некоторые ограничения, заданные интерфейсом. Иногда классы Mock просто превращаются в огромных монстров, которые больше не похожи на оригинальный класс.
ПРИМЕЧАНИЕ : если вы хотите протестировать принимающую часть, вы можете использовать ту же стратегию , Ваша тестовая реализация будет содержать ожидаемое содержимое файла для проверки ответа облака.