【问题标题】:Unable to call public instance method AddOrUpdate, mocking无法调用公共实例方法 AddOrUpdate,模拟
【发布时间】:2016-02-04 22:31:13
【问题描述】:

在模拟我的 ApplictionDbContext 时,我在方法 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
        }

错误:

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

我使用Moq4 框架进行模拟,使用xUnit 进行测试。

【问题讨论】:

  • 就您的代码显示而言,您似乎没有设置该方法。会这样吗?
  • AddOrUpdate 是扩展方法,而不是DbSet 的方法。见msdn.microsoft.com/en-us/library/hh846520(v=vs.103).aspx你不能这样拦截它。尝试重写测试。
  • 是的,我知道它是扩展方法,但我该如何处理呢?

标签: c#


【解决方案1】:

AddOrUpdate 扩展方法描述如下:

“在调用 SaveChanges 时按键添加或更新实体。等效于数据库术语中的“upsert”操作。此方法在使用 Migrations 播种数据时很有用。”

我在尝试模拟它时发现我实际上完全错误地使用了它。关于“播种时有用”的一点让我思考。您不需要调用它来更新实体对象。只要您从上下文中获取对象,SaveChanges() 就可以解决问题。

可能不是您希望的答案(并且晚了 6 个月),但也许其他人会重新考虑他们对该方法的使用。

【讨论】:

    猜你喜欢
    • 2011-10-26
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    相关资源
    最近更新 更多