Методы ложных файлов в.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.