2015-07-10 63 views
5

在嘲笑我的ApplictionDbContext時,我在方法AddOrUpdate上遇到了錯誤。無法調用公共實例方法AddOrUpdate,嘲諷

DbSet在上下文中是虛擬的。

在測試方法:

this.db.ExpensesDocuments.AddOrUpdate(doc); 

我的測試方法:

[Fact] 
     public void AddOrUpdateExpenses_Success() 
     { 
      // arrange 
      var mockSet = new Mock<DbSet<ExpensesDocument>>(); 
      var mockContext = new Mock<ApplicationDbContext>(); 
      mockContext.Setup(m => m.ExpensesDocuments).Returns(mockSet.Object); 

      var provider = new ExpensesProvider(mockContext.Object); 

      // act 
      bool result = provider.AddOrUpdateExpenses(new ExpensesDocument()); 

      // assert 
     } 

錯誤:

Result Message: System.InvalidOperationException : Unable to call public, instance method AddOrUpdate on derived IDbSet type 'Castle.Proxies.DbSet`1Proxy'. Method not found.

我使用Moq4框架嘲諷和xUnit進行測試。

+0

只要您的代碼顯示,您似乎沒有設置該方法。這可能嗎? – Chris

+0

'AddOrUpdate'是一個擴展方法,不是'DbSet'的方法。請參閱https://msdn.microsoft.com/en-us/library/hh846520(v=vs.103).aspx您無法以此方式攔截它。嘗試重寫測試。 –

+0

我知道這是擴展方法,但我該如何處理? – Nerf

回答

5

的AddOrUpdate擴展方法被描述如下:。從數據庫術語

「。當調用SaveChanges通過鍵增加或更新的實體相當於‘更新插入’操作該方法可以利用遷移有用播種數據時。 「

我在試圖嘲笑這個時發現我實際上完全錯誤地使用了它。關於「播種時有用」的一點讓我想到了。您不需要調用它來更新實體對象。只要您從上下文中獲取對象,SaveChanges()就會執行該操作。

可能不是你希望的答案(和6個月的遲到),但也許別人會重新考慮他們對方法的使用。