所以,EntityFramework 6比之前的版本更容易进行测试。对于像 Moq 这样的框架,互联网上有一些不错的例子,但问题在于,我更喜欢使用 NSubstitute。我已经将“non-query”示例翻译成了与 NSubstitute 配合使用的代码,但是我无法理解“query-test”。
Moq 的
我得到的异常信息是:
那么问题来了:如何替换IQueryable的属性(比如Provider)?
Moq 的
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);
,但它也没有成功。我得到的异常信息是:
所以,让我援引上面链接中的代码示例。此代码示例使用 Moq 来模拟 DbContext 和 DbSet。“System.NotImplementedException:类型 'DbSet
1Proxy'(继承于'DbSet
1')上尚未实现成员'IQueryable.Provider'。'DbSet`1' 的测试替身必须提供已使用的方法和属性的实现。”
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)?