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

时间:2015-06-19 10:53:40

标签: c# unit-testing moq

我在使用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);

2 个答案:

答案 0 :(得分:7)

假设您使用的是至少V6的EF并且基于此example(请查看Blogs元素),这对您来说非常相似。我猜您的问题是您的dataAccess,无论它是什么,都不会将Stocks声明为虚拟。

所以看起来应该是这样的:

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

答案 1 :(得分:-3)

您尝试设置的属性或功能需要声明为

public virtual

否则Moq无法创建一个继承的类,当你想要设置它时,它会覆盖这个函数或属性,这是不必要的。