背景: - 使用的EntityFramework 6 - 使用Moq的v4.2.1402.2112 - 使用DbFirst方法實體框架6和Moq4:是否可以讓模擬DbSet在其範圍內保留添加的數據?
我已經繼EF6 Moq的漫遊(可發現here)然而;我一直在想,是否有可能讓模擬的DbSet保留添加到其範圍內的數據?
例如:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
namespace TestingDemo
{
[TestClass]
public class QueryTests
{
[TestMethod]
public void GetAllBlogs_orders_by_name()
{
var data = new List<Blog>
{
new Blog { Name = "BBB" },
new Blog { Name = "ZZZ" },
new Blog { Name = "AAA" },
}.AsQueryable();
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());
var mockContext = new Mock<BloggingContext>();
mockContext.Setup(c => c.Blogs).Returns(mockSet.Object);
var service = new BlogService(mockContext.Object);
service.AddBlog("YYY", "http://blogs.msdn.com/yyyy");
var blogs = service.GetAllBlogs();
Assert.AreEqual(4, blogs.Count); // Fails because whilst the AddBlog is called, and we can verify this, the AsQueryable List doesn't retain the new data
Assert.AreEqual("AAA", blogs[0].Name);
Assert.AreEqual("BBB", blogs[1].Name);
Assert.AreEqual("YYY", blogs[2].Name);
Assert.AreEqual("ZZZ", blogs[3].Name);
}
}
}
是否有可能保留了所添加的數據,因此它可以在後面的測試被查詢?
你可以嘗試在你的模擬'CallBase = true'。'var mockSet = new Mock> {CallBase = true};'所以moq會調用DbSet的Add方法。 –
nemesv
感謝您的回覆,但這似乎沒有幫助;我是否需要爲添加到底層列表的添加功能設置某種鏈接? –