verifiable unit test setup objetos mock ejemplo unit-testing mocking tdd moq

unit-testing - setup - unit test c# ejemplo



¿Cómo burlarse de una llamada de función en un objeto concreto con Moq? (3)

¿Cómo puedo hacer esto en Moq?

Foo bar = new Foo(); Fake(bar.PrivateGetter).Return(''whatever value'')

Parece que solo puedo encontrar cómo simular un objeto creado a través del marco. Quiero burlarme de un solo método / propiedad en un objeto concreto que he creado.

En TypeMock, simplemente haría Isolate.WhenCalled(bar.PrivateGetter).Returns(''whatever value'') .

¿Algunas ideas?


Debería usar Moq para crear su objeto Mock y establecer la propiedad CallBase en verdadero para usar el comportamiento del objeto.

De la documentación de Moq: CallBase se define como "Invocar la implementación de la clase base si ninguna expectativa anula al miembro. Esto se llama "Mock parcial". Permite simular cierta parte de una clase sin tener que burlarse de todo.

Código de muestra:

[Test] public void FailintgTest() { var mock = new Moq.Mock<MyClass>(); mock.Setup(m => m.Number).Returns(4); var testObject = mock.Object; Assert.That(testObject.Number, Is.EqualTo(4)); Assert.That(testObject.Name, Is.EqualTo("MyClass")); } [Test] public void OKTest() { var mock = new Moq.Mock<MyClass>(); mock.Setup(m => m.Number).Returns(4); mock.CallBase = true; var testObject = mock.Object; Assert.That(testObject.Number, Is.EqualTo(4)); Assert.That(testObject.Name, Is.EqualTo("MyClass")); } public class MyClass { public virtual string Name { get { return "MyClass"; } } public virtual int Number { get { return 2; } } }


Los lunares también pueden reemplazar los métodos privados siempre que los tipos en la firma sean visibles. Entonces, en este caso, se vería así:

MFoo bar = new MFoo { // instantiate the mole of ''Foo'' PrivateGetterGet = () => "whatever value" // replace PrivateGetter {get;} }; Foo realBar = bar; // retrive the runtime instance ...

Si está buscando más información sobre Moles, comience con los tutoriales en http://research.microsoft.com/en-us/projects/pex/documentation.aspx .