2011-04-07 8 views
7

Sé que podemos llamar al SetupAllProperties() para crear automáticamente propiedades de respaldo. Pero esto es demasiado restrictivo, porque no me permite ejecutar código adicional en getter/setters. Por ejemplo, me gustaría crear un setter moq'd que invoque algún otro método/evento/lógica.MOQ: ¿cómo crear manualmente una propiedad de respaldo usando SetupGet/SetupSet?

El ejemplo de código siguiente reproduce el problema

public interface IA 
{ 
    int B { get; set; } 
}; 

class Test 
{ 
    [Test] 
    public void BackingPropertyTest() 
    { 
     int b = 1; 

     var mockA = new Mock<IA>(); 
     //mockA.SetupAllProperties(); 
     mockA.SetupGet(m => m.B).Returns(b); 
     mockA.SetupSet(m => m.B).Callback(val => b = val); 

     mockA.Object.B = 2; 
     Assert.AreEqual(2, b);    // pass. b==2 
     Assert.AreEqual(2, mockA.Object.B); // fail. mockA.Object.B==1, instead of 2 
    } 
} 

Puesto que el captador está configurado para devolver el valor de la variable local (que supongo que es ahora una variable capturado), esperaría ver mockA.Object.B == 2. Pero en cambio, es 1.

¿Me falta algo fundamentalmente aquí? ¿O es esto un error de MOQ? Estoy ejecutando MOQ 4.0.10501.6

Respuesta

13

Una solución fácil.

Cambie las devoluciones (b) a las devoluciones (() => b) en su lugar, para hacer que 'b' sea una variable capturada en lugar de simplemente una variable pasada por valor a un método.

Cuestiones relacionadas