因此 EntityFramework 6 比以前的版本具有更好的可测试性。还有一些很好的例子 http://msdn.microsoft.com/en-us/data/dn314429#queryTest在互联网上寻找像 Moq 这样的框架,但实际情况是,我更喜欢使用 NSubstitute。我已经将“非查询”示例翻译为与 NSubstitute 一起使用,但我无法理解“查询测试”。
起订量如何items.As<IQueryable<T>>().Setup(m => m.Provider).Returns(data.Provider);
翻译成NSubstitute?我想像((IQueryable<T>) items).Provider.Returns(data.Provider);
但这没有用。我也尝试过items.AsQueryable().Provider.Returns(data.Provider);
但这也不起作用。
我得到的例外是:
“System.NotImplementedException:成员“IQueryable.Provider”
尚未在“DbSet”类型上实现1Proxy' which inherits from
'DbSet
1'. “DbSet`1”的测试双打必须提供以下实现
使用的方法和属性。”
因此,让我引用上面链接中的代码示例。此代码示例使用 Moq 来模拟 DbContext 和 DbSet。
public void GetAllBlogs_orders_by_name()
{
// Arrange
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);
// ...
}
这就是我使用 NSubstitute 所取得的进展
public void GetAllBlogs_orders_by_name()
{
// Arrange
var data = new List<Blog>
{
new Blog { Name = "BBB" },
new Blog { Name = "ZZZ" },
new Blog { Name = "AAA" },
}.AsQueryable();
var mockSet = Substitute.For<DbSet<Blog>>();
// it's the next four lines I don't get to work
((IQueryable<Blog>) mockSet).Provider.Returns(data.Provider);
((IQueryable<Blog>) mockSet).Expression.Returns(data.Expression);
((IQueryable<Blog>) mockSet).ElementType.Returns(data.ElementType);
((IQueryable<Blog>) mockSet).GetEnumerator().Returns(data.GetEnumerator());
var mockContext = Substitute.For<BloggingContext>();
mockContext.Blogs.Returns(mockSet);
// ...
}
所以问题是;如何替换 IQueryable 的属性(如 Provider)?