2010-03-17 7 views
30

¿Cómo puedo hacer esto en Moq?Cómo simular una llamada a función en un objeto concreto con Moq?

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

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

En TypeMock, me gustaría hacer Isolate.WhenCalled(bar.PrivateGetter).Returns('whatever value').

¿Alguna idea?

Respuesta

13

Solo el aislador TypeMock (y tal vez los moles) puede realizar estas acrobacias. Las bibliotecas dinámicas dinámicas normales pueden only mock virtual and abstract members.

+0

Información importante: desearía que hubiera más información sobre Moles. Aún no he escuchado nada sobre personas que la utilizan aquí en SO – dferraro

+0

FWIW, aquí está el sitio oficial: http: // research. microsoft.com/en-us/projects/moles/ –

+0

Que Moq no pueda hacer esto simplemente ya no es cierto. – MushinNoShin

51

Debe 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 "simulacro parcial". Permite simular cierta parte de una clase sin tener que burlarse de todo.

Código de ejemplo:

[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; } } 
    } 
+0

Gracias, intentaré esto. Sin embargo, hace que TypeMock parezca cada vez más tentador. ¡Uf! – dferraro

+1

Esto no funcionó - dio un mensaje de error en la línea de simulación.Configuración() (en el segundo ejemplo) "Método de prueba CRMFundOfFundPluginsUnitTest.FoFPluginBaseTest.SetMissingTargetValuesTest1 lanzó excepción: System.ArgumentException: Configuración no válida en un miembro no invalidable: m => m.InputTargetDE. ". ¿Alguna idea de por qué? – dferraro

+6

Asegúrate de que los métodos que estás burlando son virtuales, por lo que Moq podrá anularlos. –

3

Moles también puede reemplazar los métodos privados, siempre que los tipos de la firma son visibles. Así pues, 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 usted está buscando más información sobre Moles, comenzar los tutoriales en http://research.microsoft.com/en-us/projects/pex/documentation.aspx.

Cuestiones relacionadas