with unitarias unit tests test setup pruebas objetos mocks mock ejemplo con and .net unit-testing mocking

.net - unitarias - unit testing with mocks



Mock File métodos en.NET(como File.Copy("1.txt", "2.txt")) (6)

Puede utilizar un marco simulado para esto y creará una copia falsa del objeto File y podrá inyectar el archivo en el sistema bajo prueba.

Recomendaré Rhino Mock.

Tenemos algunos métodos que llaman File.Copy, File.Delete, File.Exists, etc. ¿Cómo podemos probar estos métodos sin tocar el sistema de archivos?

Me considero una unidad que prueba n00b, por lo que cualquier consejo es apreciado.


Si tienes que hacer esto, Typemock Isolator es tu amigo.

No puedo decir que lo he usado yo mismo, y trataría de diseñarlo en mi lugar, pero hará el trabajo hasta donde yo sepa.


Tiendo a crear una interfaz en la mayoría de mis proyectos llamada IFileController que tiene todas las operaciones de archivos en él. Esto puede tener los básicos, además de cualquier método que el .NET Framework no proporciona que se ocupe de los archivos.

Utilizando un marco de inyección de dependencia, puede obtener una instancia de IFileController sin saber exactamente de qué tipo es, y usarlo sin necesidad de perder el tiempo con los tipos de marcos de burla. Esto hace que todo sea mucho más comprobable y, como beneficio adicional, puede cambiar el mecanismo de almacenamiento de archivos sin cambiar el código.

En el lado negativo, a los nuevos desarrolladores se les debe informar acerca de esta interfaz, de lo contrario, simplemente usarán los métodos .NET directamente.


Yo usaría Moq para esto . Tendría que crear una interfaz y una clase que se asemeje a la real para que Moq pueda crear una instancia de su proxy (una instancia simulada) pero es la mejor manera de probar este tipo de cosas.


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


Mantengo el proyecto Jolt.NET en CodePlex, que contiene una biblioteca para generar tales interfaces y sus implementaciones para usted. Consulte la biblioteca Jolt.Testing para obtener más información.