【问题标题】:System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) memberSystem.NotSupportedException:非虚拟(在 VB 中可覆盖)成员上的设置无效
【发布时间】:2015-09-05 07:56:28
【问题描述】:

我在使用 Moq 进行单元测试时收到 NotSupportedException 错误消息

System.NotSupportedException:非虚拟(在 VB 中可覆盖)成员上的设置无效

单元测试代码:

[TestMethod]
public void TestEmailNotSentOut()
{
  // ...

  var dataAccess = new Mock<TjiContext>();       
  var mockSetStock = new Mock<DbSet<Stock>>();
  mockSetStock.As<IQueryable<Stock>>().Setup(m => m.Provider).Returns(stockList.Provider);
  mockSetStock.As<IQueryable<Stock>>().Setup(m => m.Expression).Returns(stockList.Expression);
  mockSetStock.As<IQueryable<Stock>>().Setup(m => m.ElementType).Returns(stockList.ElementType);
  mockSetStock.As<IQueryable<Stock>>().Setup(m => m.GetEnumerator()).Returns(stockList.GetEnumerator());
  dataAccess.Setup(m => m.Stocks).Returns(mockSetStock.Object);

this post 中的建议说将其标记为virtual,但我不确定需要将什么标记为虚拟?

错误发生在这一行:

  dataAccess.Setup(m => m.Stocks).Returns(mockSetStock.Object);

【问题讨论】:

  • 您在哪一行收到此错误?
  • 根据您的代码,您似乎正在使用实体框架。如果是这样,有问题的行是 ׳dataAccess.Setup(m => m.Stocks).Returns(mockSetStock.Object);׳。你不能用 ׳Moq׳ 伪造这条线。 (我相信 dataAccess 是 StocksModelContext : DbContext{ public DbSet Stocks{ get; set; } })
  • 错误发生在dataAccess.Setup(m => m.Stocks).Returns(mockSetStock.Object);我正在使用 EntityFramework var dataAccess = new Mock();公共 DbSet 股票 { 获取;放;那么该行是否可以更改,或者我是否需要在不使用 Moq 的情况下找到另一种测试方法?

标签: c# unit-testing moq


【解决方案1】:

假设您使用的是至少 V6 的 EF,并且基于此 example(查看博客元素),它正在做与您非常相似的事情。我猜你的问题是你的dataAccess,不管它是什么,都没有将Stocks声明为虚拟的。

所以它应该看起来像这样:

public virtual DbSet<Stock> Stocks { get; set; } 

【讨论】:

    【解决方案2】:

    您尝试设置的属性或函数需要声明为

    public virtual
    

    否则 Moq 无法创建一个继承的类,它会在您想要设置它时覆盖此功能或属性,这是必要的。

    【讨论】:

    • OP 知道标记为虚拟。他不知道要虚拟化什么。
    • 他要设置的属性之一,即 Provider、Expression、ElementType 或 GetEnumerator()。而且我认为我对嘲笑时发生的情况的解释有助于他确定其中的哪一个。
    猜你喜欢
    • 2014-03-13
    • 2017-05-12
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2011-03-31
    • 2010-12-30
    相关资源
    最近更新 更多