Burlarse de objetos sin constructor sin argumento en C#/. NET


¿Es posible crear un mock a partir de una clase que no proporciona un constructor sin argumento y no pasa ningún argumento al constructor? Tal vez con la creación de IL dinámicamente?

El fondo es que no quiero definir interfaces solo para pruebas. La solución sería proporcionar un constructor sin argumentos para las pruebas.

Author: deamon, 2011-03-10

2 answers

Seguro. En este ejemplo usaré Moq, una biblioteca de burlas realmente impresionante.

Ejemplo:

public class MyObject
{
     public MyObject(object A, object B, object C)
     {
          // Assign your dependencies to whatever
     }
}

Mock<MyObject> mockObject = new Mock<MyObject>();
Mock<MyObject> mockObject = new Mock<MyObject>(null, null, null); // Pass Nulls to specific constructor arguments, or 0 if int, etc

En muchos casos, sin embargo, asigno objetos Simulados como argumentos para poder probar las dependencias:

Mock<Something> x = new Mock<Something>();
MyObject mockObject = new MyObject(x.Object);

x.Setup(d => d.DoSomething()).Returns(new SomethingElse());

etc
 43
Author: Tejs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-10 18:44:23

Es erróneo creer que está proporcionando interfaces solo para pruebas. Las interfaces están ahí para proporcionar abstracciones y debilitar el acoplamiento entre las diferentes capas de su código haciéndolas más reutilizables en diferentes contextos.

Dicho esto, la respuesta dependerá del framework de burla que estés usando. Por ejemplo, con Rhino Burlas podrías tener:

public class Foo
{
    public Foo(string bar)
    { }

    public virtual int SomeMethod()
    {
        return 5;
    }
}

Y luego:

var fooMock = MockRepository.GeneratePartialMock<Foo>("abc");
fooMock.Expect(x => x.SomeMethod()).Return(10);
 1
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-10 16:53:08