Al pasar por https://github.com/Moq/moq4/wiki/Quickstart , veo que se burla de una interfaz.
Tengo una clase en mi código heredado que no tiene una interfaz. Cuando Mock<MyClass> , obtengo la siguiente excepción:
Información adicional: No se puede instanciar el proxy de la clase: MyCompnay.Mylegacy.MyClass.
¿Cómo puedo usar Moq para simular la clase del código heredado?
Es posible Simular clases concretas
[TestClass] public class PlaceholderParserFixture { public class Foo { public virtual int GetValue() { return 11; } } public class Bar { private readonly Foo _foo; public Bar(Foo foo) { _foo = foo; } public int GetValue() { return _foo.GetValue(); } } [TestMethod] public void MyTestMethod() { var foo = new Mock<Foo>(); foo.Setup(mk => mk.GetValue()).Returns(16); var bar = new Bar(foo.Object); Assert.AreEqual(16, bar.GetValue()); } }pero,
Los mensajes que recibí para:
Haciendo la clase interna
Castle.DynamicProxy.Generators.GeneratorException: el tipo MoqFixture+Foo no es público. No se puede crear proxy para tipos que no son accesibles.
o, tener un método no virtual
System.NotSupportedException: configuración no válida en un miembro no virtual (reemplazable en VB): mk => mk.GetValue()
no coincida con su mensaje de cannot instantiate , por lo que algo más parece estar mal.
Si no tiene un constructor predeterminado en el objeto simulado, puede obtener ese mensaje de error
p.ej
public class Foo { private int _value; public Foo(int value) { _value = value; } public virtual int GetValue() { return _value; } }uno puede evitar esto pasando valores al Mock<> ctor
p.ej
var foo = new Mock<Foo>(MockBehavior.Strict, new object[] { 11 });