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

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

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

Ответ 1

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!!!
}

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Я порекомендую Rhino Mock.

Ответ 5

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

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

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

Ответ 6

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