Burlas parciales de clase con Moq.

Quiero burlarme solo del método GetValue de la siguiente clase, usando Moq:

 public class MyClass { public virtual void MyMethod() { int value = GetValue(); Console.WriteLine("ORIGINAL MyMethod: " + value); } internal virtual int GetValue() { Console.WriteLine("ORIGINAL GetValue"); return 10; } } 

Ya leí un poco cómo debería funcionar esto con Moq. La solución que encontré en línea es usar la propiedad CallBase , pero eso no funciona para mí.

Esta es mi prueba:

 [Test] public void TestMyClass() { var my = new Mock { CallBase = true }; my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999); my.Object.MyMethod(); my.VerifyAll(); } 

Espero que Moq use la implementación existente de MyMethod y llame al método MyMethod , lo que da como resultado el siguiente resultado:

 ORIGINAL MyMethod: 999 MOCKED GetValue 

pero eso es lo que obtengo:

 ORIGINAL GetValue ORIGINAL MyMethod: 10 

y entonces

 Moq.MockVerificationException : The following setups were not matched: MyClass mock => mock.GetValue() 

Me dio la sensación de que entendí mal algo por completo. ¿Que me estoy perdiendo aqui? Cualquier ayuda sería apreciada

OK, encontré la respuesta a esto en otra pregunta: ¿Cómo simular el método interno de una clase? . Así que esto es un duplicado y se puede cerrar.

Sin embargo, aquí está la solución: solo agregue esta línea al Assembly.config del proyecto que desea probar:

 [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq 

¿Intentaste especificar verificable:

 my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999).Verifiable();