Смещение объектов без конструктора без аргументов в С#/.NET
Можно ли создать mock из класса, который не предоставляет конструктор без аргументов и не передает никаких аргументов конструктору? Может быть, с созданием ИИ динамически?
Предполагается, что я не хочу определять интерфейсы только для тестирования. Обходной путь состоял в том, чтобы предоставить конструктор без аргументов для тестирования.
Ответы
Ответ 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);