NSubstitute DbSet / IQueryable的< T> [英] NSubstitute DbSet / IQueryable<T>

查看:325
本文介绍了NSubstitute DbSet / IQueryable的< T>的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

那么的EntityFramework 6是好了很多,可检验的话previous版本。并有一些很好的例子互联网像起订量的框架上的,但情况是,我使用NSubstitute preFER。我已经得到了非查询的实例翻译与使用NSubstitute的工作,但我不能让我的头围绕查询测试。

So EntityFramework 6 is a lot better testable then previous versions. And there are some nice examples on the internet for frameworks like Moq, but the case is, I prefer using NSubstitute. I've got the "non-query" examples translated to work with the use of NSubstitute, but I can't get my head around the 'query-test'.

如何起订量的 items.As< IQueryable的< T>>()设置(M => m.Provider).Returns(data.Provider); 翻译成NSubstitute?我觉得像((IQueryable的< T>)项).Provider.Returns(data.Provider); ,但没有奏效。我也试过 items.AsQueryable()Provider.Returns(data.Provider); 但没有任何工作

How does Moq's items.As<IQueryable<T>>().Setup(m => m.Provider).Returns(data.Provider); translate to NSubstitute? I thought something like ((IQueryable<T>) items).Provider.Returns(data.Provider); but that didn't work. I've also tried items.AsQueryable().Provider.Returns(data.Provider); but that didn't work either.

我得到的exeption是:

The exeption I'm getting is:

System.NotImplementedException:会员'IQueryable.Provider
  尚未对类型DbSet 1Proxy从继承得到落实
  DbSet
1。测试双打DbSet`1必须提供的实现
  方法和所使用的性能。

"System.NotImplementedException : The member 'IQueryable.Provider' has not been implemented on type 'DbSet1Proxy' which inherits from 'DbSet1'. Test doubles for 'DbSet`1' must provide implementations of methods and properties that are used."

因此​​,让我从上面的链接引用code例子。这code样品使用起订量嘲笑的DbContext和DbSet。

So let me quote the code example from the link above. This code sample uses Moq to mock the DbContext and 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

And this is how far I come with 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的属性(如供应商)?

So the question is; How does one Substitute a property of IQueryable (like Provider)?

推荐答案

这是因为特定的NSubstitute语法。例如:

This happens because of NSubstitute syntax specific. For example in:

((IQueryable<Blog>) mockSet).Provider.Returns(data.Provider);

NSubstitute调用提供的getter,那么它指定的返回值。此getter通话不被截获的替代品,你会得到一个异常。这是因为明确实施的DBQuery类IQueryable.Provider财产。

NSubstitute calls the Provider's getter, then it specifies the return value. This getter call isn't intercepted by the substitute and you get an exception. It happens because of explicit implementation of IQueryable.Provider property in DbQuery class.

您可以明确地创建用于NSUB多个接口的替代品,并创建涵盖所有指定接口的代理。然后调用接口将被替代被截获。
请使用以下语法:

You can explicitly create substitutes for multiple interfaces with NSub, and it creates a proxy which covers all specified interfaces. Then calls to the interfaces will be intercepted by the substitute. Please use the following syntax:

// Create a substitute for DbSet and IQueryable types:
var mockSet = Substitute.For<DbSet<Blog>, IQueryable<Blog>>();

// And then as you do:
((IQueryable<Blog>)mockSet).Provider.Returns(data.Provider);
...

这篇关于NSubstitute DbSet / IQueryable的&LT; T&GT;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆