Методы 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.