Quiero burlarse sólo el método de la clase siguiente GetValue
, utilizando Moq:burla parcial de clase con 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 leer un poco cómo se debe trabajar 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<MyClass> { CallBase = true };
my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999);
my.Object.MyMethod();
my.VerifyAll();
}
yo esperaría que Moq utiliza la implementación existente de MyMethod
y llama al método burlado, lo que resulta en la siguiente salida:
ORIGINAL MyMethod: 999
MOCKED GetValue
pero eso es lo que yo consiga:
ORIGINAL GetValue
ORIGINAL MyMethod: 10
y luego
Moq.MockVerificationException : The following setups were not matched: MyClass mock => mock.GetValue()
Tengo la sensación de que he entendido mal algo por completo. ¿Que me estoy perdiendo aqui? Cualquier ayuda se agradece
posible duplicado de [Al burlarse de una clase con Moq, ¿cómo puedo CallBase por sólo específica Métodos?] (http://stackoverflow.com/questions/2822947/when-mocking-a-class-with-moq-how-can-i-callbase-for-just-specific-methods) – StriplingWarrior
Si haces tu ' El método GetValue' public' en lugar de 'internal' funciona. No sé por qué tal vez esta es una limitación del proxy dinámico del castillo, o es un error Moq, o este es el comportamiento previsto. De todos modos, si lo deja como interno no puede poner su código de producción en un ensamblaje diferente a menos que use InternalVisibleTo. – nemesv
posible duplicado de [Verificando que se llamó un método] (http://stackoverflow.com/questions/1980108/verifying-a-method-was-llamado) – nemesv