Подтвердить что ты не робот

Смещение объектов без конструктора без аргументов в С#/.NET

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

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

4b9b3361

Ответ 1

Конечно. В этом примере я буду использовать 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

Ответ 2

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

При этом ответ будет зависеть от насмешливой структуры, которую вы используете. Например, с 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);