无法调用公共实例方法AddOrUpdate,mocking

Ner*_*erf 5 c#

虽然嘲笑我的ApplictionDbContext方法有错误AddOrUpdate.

DbSet 在上下文中是虚拟的.

测试方法:

this.db.ExpensesDocuments.AddOrUpdate(doc);
Run Code Online (Sandbox Code Playgroud)

我的测试方法:

[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
        }
Run Code Online (Sandbox Code Playgroud)

错误:

结果消息:System.InvalidOperationException:无法在派生的IDbSet类型'Castle.Proxies.DbSet`1Proxy'上调用public,实例方法AddOrUpdate.找不到方法.

我正在使用Moq4框架进行模拟和xUnit测试.

小智 6

AddOrUpdate扩展方法如下所述:

"调用SaveChanges时按键添加或更新实体.相当于数据库术语中的"upsert"操作.当使用Migrations播种数据时,此方法很有用.

我在试图嘲笑这个时发现我实际上完全错了.关于"播种时有用"的一点让我思考.您无需调用此方法来更新实体对象.只要从上下文中获取了对象,SaveChanges()就可以完成.

可能不是你希望的答案(并且迟到6个月),但也许其他人会重新考虑他们对这种方法的使用.