2015-07-10 88 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个月的迟到),但也许别人会重新考虑他们对方法的使用。