2012-06-13 19 views
10

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

+0

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

+0

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

+0

posible duplicado de [Verificando que se llamó un método] (http://stackoverflow.com/questions/1980108/verifying-a-method-was-llamado) – nemesv

Respuesta

5

OK, he encontrado la respuesta a esta pregunta en otro: How to Mock the Internal Method of a class?. Entonces este es un duplicado y se puede cerrar.

Sin embargo, aquí está la solución: sólo tiene que añadir esta línea a la Assembly.config del proyecto que desea probar:

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

¿Para el Assembly.config de la prueba? ¿O a la clase que está siendo probada Assembly.config? – Nick

+0

¡De la clase que está siendo probada! Edité mi respuesta y aclare ese poco. – Fabian

0

¿trató de especificar verificable:

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

no lo intenté, pero no hace ninguna diferencia – Fabian

Cuestiones relacionadas