System.NotSupportedException:非虚拟(在 VB 中可覆盖)成员上的设置无效
System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member
我在使用 Moq 进行单元测试时收到 NotSupportedException 错误消息
System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member
单元测试代码:
[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);
您尝试设置的 属性 或函数需要声明为
public virtual
否则 Moq 无法创建继承的 class,它会在您要设置时覆盖此函数或属性,这是必需的。
假设您使用的 EF 至少为 V6,并且基于此 example(查看博客元素),它正在做与您非常相似的事情。我猜你的问题是你的 dataAccess
,无论它是什么,都没有将 Stocks
声明为虚拟的。
所以它应该看起来像这样:
public virtual DbSet<Stock> Stocks { get; set; }
我在使用 Moq 进行单元测试时收到 NotSupportedException 错误消息
System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member
单元测试代码:
[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);
您尝试设置的 属性 或函数需要声明为
public virtual
否则 Moq 无法创建继承的 class,它会在您要设置时覆盖此函数或属性,这是必需的。
假设您使用的 EF 至少为 V6,并且基于此 example(查看博客元素),它正在做与您非常相似的事情。我猜你的问题是你的 dataAccess
,无论它是什么,都没有将 Stocks
声明为虚拟的。
所以它应该看起来像这样:
public virtual DbSet<Stock> Stocks { get; set; }