使用最小起订量,如果我尝试直接在Foo
嘲笑的方法,我得到这个:Invalid verify on a non-virtual (overridable in VB) member.
如何在没有默认构造函数的情况下模拟对象的方法?
我的选择是嘲笑IFoo
,它摆脱了上述问题,但我不能建造它,因为Foo
没有无参数构造函数(Constructor arguments cannot be passed for interface mocks.
)。我能做什么?
使用最小起订量,如果我尝试直接在Foo
嘲笑的方法,我得到这个:Invalid verify on a non-virtual (overridable in VB) member.
如何在没有默认构造函数的情况下模拟对象的方法?
我的选择是嘲笑IFoo
,它摆脱了上述问题,但我不能建造它,因为Foo
没有无参数构造函数(Constructor arguments cannot be passed for interface mocks.
)。我能做什么?
你应该能够嘲笑的IFoo没有问题,你也没有理由来传递参数,当你嘲笑的接口。你的IFoo模拟将完全是(模拟!),并且将不知道Foo或任何实际的实现,所以传递构造函数参数是没有意义的。
编辑:我会补充说,模拟一个接口,如果存在几乎总是优于嘲笑具体的实现。如果你只有一个具体的实现,你想嘲笑它的事实可能意味着它将是一个很好的候选添加接口。
Moq创建一个代理对象,它要求你所有的模拟方法都可以被覆盖,并且你的类不被密封。所以你可以将你的方法标记为虚拟。
下面的代码工作正常:
public interface IFoo
{
int Test(int myParameter);
int TestInternal(int myParameter);
}
public class Foo : IFoo
{
private int _someConstructorArgument;
public Foo(int someConstructorArgument)
{
_someConstructorArgument = someConstructorArgument;
}
public virtual int Test(int myParameter)
{
return _someConstructorArgument + TestInternal(myParameter);
}
public virtual int TestInternal(int myParameter)
{
return myParameter;
}
}
public class Program
{
static void Main(string[] args)
{
var mock = new Mock<Foo>(MockBehavior.Loose, 50);
mock.Setup(x => x.TestInternal(100))
.Returns(200);
mock.CallBase = true;
Console.WriteLine(mock.Object.Test(100));
Console.ReadLine();
}
}
你完全正确。我甚至没有考虑过这个问题,我只是想找点工作。谢谢。 – ryeguy