是否可以从不提供无参数构造函数的类创建模拟,并且不将任何参数传递给构造函数?也许是动态创建IL?
背景是我不想仅为测试定义接口。解决方法是为测试提供无参数构造函数。
答案 0 :(得分:44)
当然可以。在这个例子中,我将使用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 :(得分:1)
认为您仅为测试提供接口是错误的。接口用于提供抽象并削弱代码不同层之间的耦合,使它们在不同的上下文中更具可重用性。
这就是说答案将取决于您正在使用的模拟框架。例如,你可以使用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);