Так что EntityFramework 6 намного лучше тестируется, чем предыдущие версии. И есть some nice examples в Интернете для фреймворков, таких как Moq, но дело в том, что я предпочитаю использовать NSubstitute. У меня есть примеры «без запроса», переведенные для работы с использованием NSubstitute, но я не могу обойти «запрос-тест».NSubstitute DbSet/IQueryable <T>
Как Moq's 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' Test удваивается«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 (например, поставщика)?
ОБНОВЛЕНО: Используйте пакет [EntityFramework.Testing.NSubstitute] (https://github.com/scott-xu/EntityFramework.Testing), что обеспечивает реализацию DbAsyncQueryProvider. –