Методы ложных файлов в.NET (например, File.Copy("1.txt", "2.txt"))

У нас есть несколько методов, которые вызывают File.Copy, File.Delete, File.Exists и т. Д. Как мы можем протестировать эти методы, не затрагивая файловую систему?

Я считаю себя юнит-тестером n00b, поэтому любые советы приветствуются.

6 ответов

Решение
public interface IFile {
    void Copy(string source, string dest);
    void Delete(string fn);
    bool Exists(string fn);
}

public class FileImpl : IFile {
    public virtual void Copy(string source, string dest) { File.Copy(source, dest); }
    public virtual void Delete(string fn) { File.Delete(fn); }
    public virtual bool Exists(string fn) { return File.Exists(fn); }
}

[Test]
public void TestMySystemCalls() {
    var filesystem = new Moq.Mock<IFile>();
    var obj = new ClassUnderTest(filesystem);
    filesystem.Expect(fs => fs.Exists("MyFile.txt")).Return(true);
    obj.CheckIfFileExists(); // doesn't hit the underlying filesystem!!!
}

Если вам абсолютно необходимо это сделать, Typemock Isolator - ваш друг.

Я не могу сказать, что использовал это сам, и вместо этого я попытался бы придумать, как это сделать, но, насколько я знаю, это будет работать.

Я бы использовал Moq для этого. Вам нужно будет создать интерфейс и класс, которые будут работать с реальными объектами, чтобы Moq мог создать экземпляр вашего прокси-сервера (поддельный экземпляр), но это лучший способ протестировать такого рода вещи.

Я склонен создавать интерфейс в большинстве своих проектов под названием IFileController, в котором есть все файловые операции. Это могут быть базовые методы плюс любые методы, которые не предусмотрены.NET Framework для работы с файлами.

Используя инфраструктуру внедрения зависимостей, вы можете получить экземпляр IFileController, не зная точно, что это за тип, и использовать его без необходимости возиться с насмешливыми типами инфраструктуры. Это делает все гораздо более тестируемым, и в качестве бонуса вы можете изменить механизм хранения файлов, не меняя код вообще.

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

Я поддерживаю проект Jolt.NET на CodePlex, который содержит библиотеку для создания таких интерфейсов и их реализации для вас. Пожалуйста, обратитесь к библиотеке Jolt.Testing для получения дополнительной информации.

Для этого вы можете использовать макет фреймворка, и он создаст поддельную копию объекта File, и вы сможете внедрить файл в тестируемую систему.

Я буду рекомендовать Rhino Mock.

Другие вопросы по тегам