使用moq,如果我尝试直接在Foo
上模拟方法,我会得到:Invalid verify on a non-virtual (overridable in VB) member.
我的替代方案是模拟IFoo
,它摆脱了上述问题,但后来我无法构造它,因为Foo
没有无参数的构造函数(Constructor arguments cannot be passed for interface mocks.
)。我该怎么办?
答案 0 :(得分:7)
您应该可以毫无问题地模拟IFoo,并且在模拟接口时没有理由传递参数。你的IFoo模拟就是那个(一个模拟!),并且不知道Foo或任何真正的实现,所以传递构造函数参数是没有意义的。
编辑:我想补充说,如果一个接口存在,那么模拟一个接口几乎总是比模拟一个具体的实现更好。如果你只有一个具体的实现,你想要模拟它的事实可能意味着它将是一个很好的候选添加接口。
答案 1 :(得分:0)
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();
}
}