是否可以创建一个模拟类,该类不提供无参构造函数且不向构造函数传递任何参数?也许可以通过动态创建IL实现?
背景是我不想仅为测试目的而定义接口。解决方法是为测试提供一个无参构造函数。
是否可以创建一个模拟类,该类不提供无参构造函数且不向构造函数传递任何参数?也许可以通过动态创建IL实现?
背景是我不想仅为测试目的而定义接口。解决方法是为测试提供一个无参构造函数。
当然可以。在这个示例中,我将使用 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<Something> x = new Mock<Something>();
MyObject mockObject = new MyObject(x.Object);
x.Setup(d => d.DoSomething()).Returns(new SomethingElse());
etc
错误的认为你只是为测试提供接口。接口存在的目的是提供抽象,并减弱代码不同层之间的耦合,使它们在不同上下文中更加可重用。
话虽如此,答案将取决于您使用的模拟框架。例如,使用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);