[英]moq.As<>().Setup() does not seem to work after getting moq.Object
我從 Microsoft 關於使用 moq 測試 EF 的文章中得出一個小測試: 使用 mocking 框架進行測試
namespace TestingDemo
{
public class BloggingContext : DbContext
{
public virtual DbSet<Blog> Blogs { get; set; }
}
public class Blog
{
public string Name { get; set; }
}
[TestClass]
public class QueryTests
{
[TestMethod]
public void Test()
{
var data = new List<Blog> { new Blog { Name = "AAA" } }.AsQueryable();
var mockSet = new Mock<DbSet<Blog>>();
//var a = mockSet.Object;
mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
var b = mockSet.Object.ToList();
}
}
}
它工作正常,直到我取消注釋var a = mockSet.Object;
行在此之后,我在var b = mockSet.Object.ToList();
System.NotImplementedException: '成員'IEnumerable.GetEnumerator'尚未在繼承自'DbSet`1'的類型'DbSet`1Proxy'上實現。 'DbSet`1' 的測試替身必須提供所使用的方法和屬性的實現。
我錯過了什么嗎?
UPD:使用最小起訂量 4.10.1、EF 6.2.0、VS 社區 2019 16.6.1、.NET 4.7.2
您實際上需要創建 DbContext 模擬以及:
var context = new Mock<BloggingDbContext>();
var mockSet = new Mock<DbSet<Blog>>();
mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
context.Setup(c => c.Blogs).Returns(mockSet.Object);
var blogs = context.Object.Blogs.ToList(); // usage
問題是您在獲得模擬的 object ( mockSet.Object
) 的實例后添加IQueryable<T>
設置; 它不起作用,這也是為什么一旦您將分配注釋到a
后它就可以正常工作的原因。 為要使用的行為添加設置后,您應該只檢索模擬的 object。
有趣的是,一旦您添加了這些設置,您就可以隨時更改它們(使用另一個設置覆蓋)。 您只需在檢索模擬的 object 之前進行初始注冊。 我一直用我的系統模擬庫來做這件事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.