我試圖模擬(使用Moq)在第三方SDK中定義的類和接口。下面是他們的樣子一個簡單的例子:如何在模擬具體類時設置屬性
public interface IVehicle
{
string Type { get; }
}
public class Vehicle
{
public string Type { get; }
}
public class Jeep : Vehicle, IVehicle
{
}
我可以很容易地嘲笑界面,如下所示:
var mockVehicle = new Mock<IVehicule>(MockBehavior.Strict);
mockVehicle
.SetupGet(v => v.Type)
.Returns("My custom vehicle");
,但我需要編寫特定於Jeep
類單元測試,我可以」弄清楚如何嘲笑它。
我第一次嘗試:
var mockJeep = new Mock<Jeep>(MockBehavior.Strict);
產生以下錯誤:
Moq.MockException: IVehicle.Type invocation failed with mock behavior Strict.
All invocations on the mock must have a corresponding setup.
這是可以理解的,因爲我還沒有安裝的Type
財產。
我的第二次嘗試:
var mockJeep = new Mock<Jeep>(MockBehavior.Strict);
mockJeep
.SetupGet(v => v.Type)
.Returns("Jeep");
產生以下錯誤消息:
System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member: v => v.Type
這也是可以理解的,因爲Type
財產上Vehicle
類不是虛擬的。
所以我的問題是:有沒有辦法在嘲笑Jeep
類時設置Type
屬性?
你可以不要模擬一個具體的類,至少不要使用moq。其次,你不需要模擬'Jeep'類來測試它。創建一個模擬的手段來創建一種*假*對象。 – meJustAndrew
在這種情況下,最好的Moq可以做的是創建一個代理作爲'Jeep'的派生類,但是它不能覆蓋'Type'屬性。如果您有Visual Studio許可證級別來查看,微軟假冒與Moq很好地玩。其他解決方案也存在,但我能想到的那些解決方案將在您的單元測試中完全取代Moq,而不是增強它。我會重新寫這個答案。 – RavB
@RAVB:謝謝你的提示,我會教給自己微軟假貨 – desautelsj