簡體   English   中英

moq.As<>().Setup() 在得到 moq.Object 后似乎不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM