簡體   English   中英

如何模擬 IDataRecord?

[英]How to mock IDataRecord?

我正在嘗試使用 Moq 模擬IDataRecord

模擬創建如下:

Mock<IDataRecord> mockDataRecord = new Mock<IDataRecord>();

被測線路是:

DateTime timestamp = dataRecord.GetValueOrDefault<DateTime>("QUEUE_ADD_TS");

試過:

mockDataRecord.Setup(r => r.GetValueOrDefault<DateTime>("QUEUE_ADD_TS")).Returns(now);

...但它給出了一個運行時錯誤:

表達式引用了一個不屬於模擬對象的方法: r => r.GetValueOrDefault("QUEUE_ADD_TS")

還嘗試用It.IsAny<String>()代替"QUEUE_ADD_TS"但沒有區別。 這應該很容易,但我正在撓頭 - 感謝您的任何建議!

我這樣做,又快又臟:

Mock<IDataRecord> dataRecord = new Mock<IDataRecord>();
dataRecord.Setup(column => column["applicationno"]).Returns("foobar");
dataRecord.Setup(column => column["numberOfApplications"]).Returns(12);

您不能模擬靜態或擴展方法,因為大多數模擬框架在后台使用動態代理。

在您的測試中,不要存根擴展方法。 相反,存根原始方法本身,例如:

mockDataRecord.Setup(r => r.GetValue<DateTime>("QUEUE_ADD_TS")).Returns(now);

您應該單獨測試擴展方法,例如:

  1. 存根 GetValue 方法並斷言 GetValueOrDefault 返回存根值。

  2. 不要存根 GetValue 方法,並斷言 GetValueOrDefault 返回默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM