Методы ложных файлов в .NET (например, File.Copy ("1.txt", "2.txt")) - PullRequest
14 голосов
/ 06 ноября 2008

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

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

Ответы [ 6 ]

23 голосов
/ 06 ноября 2008
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!!!
}
3 голосов
/ 06 ноября 2008

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

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

2 голосов
/ 06 ноября 2008

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

0 голосов
/ 08 сентября 2009

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

0 голосов
/ 06 ноября 2008

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

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

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

0 голосов
/ 06 ноября 2008

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

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

...