我在使用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);
答案 0 :(得分:7)
假设您使用的是至少V6的EF并且基于此example(请查看Blogs元素),这对您来说非常相似。我猜您的问题是您的dataAccess
,无论它是什么,都不会将Stocks
声明为虚拟。
所以看起来应该是这样的:
public virtual DbSet<Stock> Stocks { get; set; }
答案 1 :(得分:-3)
您尝试设置的属性或功能需要声明为
public virtual
否则Moq无法创建一个继承的类,当你想要设置它时,它会覆盖这个函数或属性,这是不必要的。