Пересмешивание объектов без конструктора без аргументов в C # / .NET - PullRequest
30 голосов
/ 10 марта 2011

Можно ли создать макет из класса, который не предоставляет конструктор без аргументов и не передает аргументы конструктору? Может быть, с созданием IL динамически?

Фон в том, что я не хочу определять интерфейсы только для тестирования. Обходной путь может заключаться в предоставлении конструктора без аргументов для тестирования.

Ответы [ 2 ]

45 голосов
/ 10 марта 2011

Конечно.В этом примере я буду использовать Moq, действительно потрясающую библиотеку-макет.

Пример:

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

Во многих случаях я назначаю объекты Mock в качестве аргументов, чтобы можно было проверить зависимости:

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

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

etc
1 голос
/ 10 марта 2011

Неправильно полагать, что вы предоставляете интерфейсы только для тестирования.Существуют интерфейсы, обеспечивающие абстракции и ослабляющие связь между различными уровнями вашего кода, что делает их более пригодными для повторного использования в различных контекстах.

При этом ответ будет зависеть от используемой вами среды моделирования.Например, с Rhino Mocks вы можете иметь:

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

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

и затем:

var fooMock = MockRepository.GeneratePartialMock<Foo>("abc");
fooMock.Expect(x => x.SomeMethod()).Return(10);
...