使用最小起訂量,如果我嘗試直接在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