2011-06-18 24 views
7

Usando moq, si trato de burlarse de un método directamente en Foo, me sale esto: Invalid verify on a non-virtual (overridable in VB) member.¿Cómo puedo simular un método en un objeto sin un constructor predeterminado?

Mi alternativa es burlarse IFoo, que elimina el problema anterior, pero entonces no se puede construir porque Foo no tiene un constructor paramaterless (Constructor arguments cannot be passed for interface mocks.). ¿Que puedo hacer?

Respuesta

6

Usted debe ser capaz de burlarse IFoo sin problema, y ​​que no tendría ninguna razón para pasar argumentos cuando se está burlando de una interfaz. Tu simulación IFoo será exactamente eso (¡un simulacro!), Y no tendrás conocimiento de Foo ni de ninguna implementación real, por lo que pasar argumentos de constructor no tendría sentido.

Editar: Añadiría que burlarse de una interfaz, si existe, es casi siempre preferible a burlarse de una implementación concreta. Si solo tiene una implementación concreta, el hecho de que quiera burlarse probablemente significa que sería un buen candidato para agregar una interfaz.

+1

Tiene toda la razón. Ni siquiera estaba pensando en esto, solo estaba tratando de hacer que algo funcionara. Gracias. – ryeguy

0

Moq crea un proxy-objeto que requiere que todos sus métodos simulados sean reemplazables y su clase no está sellada. Entonces puedes marcar tu método como virtual.

El código siguiente funciona bien:

public interface IFoo 
{ 
    int Test(int myParameter); 
    int TestInternal(int myParameter); 
} 

public class Foo : IFoo 
{ 
    private int _someConstructorArgument; 

    public Foo(int someConstructorArgument) 
    { 
     _someConstructorArgument = someConstructorArgument; 
    } 

    public virtual int Test(int myParameter) 
    { 
     return _someConstructorArgument + TestInternal(myParameter); 
    } 

    public virtual int TestInternal(int myParameter) 
    { 
     return myParameter; 
    } 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var mock = new Mock<Foo>(MockBehavior.Loose, 50); 

     mock.Setup(x => x.TestInternal(100)) 
      .Returns(200); 

     mock.CallBase = true; 

     Console.WriteLine(mock.Object.Test(100)); 
     Console.ReadLine(); 
    } 
} 
Cuestiones relacionadas