CSharp - 在 VB ) 中,成員在非虛擬狀態上設置無效( 重寫?

  显示原文与译文双语对照的内容
120 2

我有一個 單元測試,我必須模擬返回布爾類型的非虛方法

public class XmlCupboardAccess
{
 public bool IsDataEntityInXmlCupboard(string dataId,
 out string nameInCupboard,
 out string refTypeInCupboard,
 string nameTemplate = null)
 {
 return IsDataEntityInXmlCupboard(_theDb, dataId, out nameInCupboard, out refTypeInCupboard, nameTemplate);
 }
}

我有 XmlCupboardAccess 類的模擬對象,我正在嘗試在我的測試用例中設置這個方法的模擬,如下所示

[TestMethod]
Public void Test()
{
 private string temp1;
 private string temp2;
 private Mock<XmlCupboardAccess> _xmlCupboardAccess = new Mock<XmlCupboardAccess>();
 _xmlCupboardAccess.Setup(x => x.IsDataEntityInXmlCupboard(It.IsAny<string>(), out temp1, out temp2, It.IsAny<string>())).Returns(false); 
//exception is thrown by this line of code
}

但該行引發異常

Invalid setup on a non-virtual (overridable in VB) member: 
x => x.IsDataEntityInXmlCupboard(It.IsAny<String>(),. temp1,. temp2, 
It.IsAny<String>())

關於如何繞過這裡異常的建議?

时间:原作者:0个回答

65 1

最小值不能模仿非虛方法和密封類。在使用模擬對象運行測試時,minimum實際上創建了內存代理類型,它繼承了你的"xmlcupboardaccess",並覆蓋了你在"設置"方法中設置的行為。如你在 C# 中所知道的,只有在它被標記為虛擬的情況下,才能重寫某些內容。Java假設默認情況下每個非靜態方法都是虛擬的。

我認為你應該考慮的另一個事情是為"cupboardaccess"引入一個介面,並開始模擬介面。它將幫助你分離代碼,並在長期運行中有好處。

最後,還有一些框架:IL直接工作,因此可以模擬非虛方法的TypeMockJustMock 。然而,它們都是商業產品。

原作者:
...