亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過 Moq 從 EF 模擬 Find()

如何通過 Moq 從 EF 模擬 Find()

C#
慕田峪9158850 2023-09-24 17:18:41
我的可測試函數使用EF.Find()so,因為我發現我需要實現 find 的模擬。似乎被編譯的唯一代碼是c#testsContextMock.Setup(m => m.Find(It.IsAny<Type>(), It.IsAny<object[]>())) .Returns<object[]>(hashes => testsMock.Object.FirstOrDefault(u => u.hash == (string)hashes[0]))其中testsContextMock是Mock<DbContext>對象,并且testsMock是Mock<DbSet<MyEntity>>。但是完成此代碼后我收到此錯誤System.ArgumentException : Invalid callback.  Setup on method with 2 parameter(s) cannot invoke callback  with different number of parameters (1).正如我假設發生這種情況的原因是調用的可測試方法簽名Find()是DbSet<MyEntity>.Find(params object[] keyValues)和模擬方法的簽名是DbContext.Find(Type entityType, params object[] keyValues)。如果我嘗試模擬其他重載,它會因編譯器錯誤而失敗 Argument 1: cannot convert from 'object[]' to 'System.Type'
查看完整描述

1 回答

?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

讓我們仔細看看被調用函數的簽名:

  1. DbContext.Find(Type entityType, params object[] keyValues)我們在模擬中得到了什么

  2. DbSet<MyEntity>.Find(params object[] keyValues)我們從方法中得到什么

這很容易看到,但不知何故我錯過了第一個參考上下文和第二個集合。所以在我的調用中而不是從上下文中查找m

testsContextMock.Setup(m => m.Find(It.IsAny<Type>(), It.IsAny<object[]>()))

我只需要從正確的DbSet中找到

testsContextMock.Setup(m => m.MyEntities.Find(It.IsAny<object[]>()))


查看完整回答
反對 回復 2023-09-24
  • 1 回答
  • 0 關注
  • 160 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號