所以EntityFramework 6比以前的版本更好地测试。互联网上有像Moq这样的框架的some nice examples,但情况是,我更喜欢使用NSubstitute。我有翻译过的“非查询”例子与NSubstitute的使用一起工作,但我无法理解“查询测试”。NSubstitute DbSet/IQueryable <T>
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);
,但那也没用。
我得到的exeption是:
“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)?
更新:使用[EntityFramework.Testing.NSubstitute](https://github.com/scott-xu/EntityFramework.Testing)包,提供DbAsyncQueryProvider的实现。 –