Я была такая же драма, как @GetFuzzy выше - казалось, что независимо от того, что я сделал, я не мог избежать NullReferenceException всякий раз, когда Include() вызов был сделан на MOq DbSet. Пример Github в другом ответе, к сожалению, не сработал: Set.Include() всегда возвращает null.
После долгой игры я придумал обходной путь для этого.
[Test]
public void CanUseIncludeWithMocks()
{
var child = new Child();
var parent = new Parent();
parent.Children.Add(child);
var parents = new List<Parent> { parent };
var children = new List<Child> { child };
var parentsDbSet1 = new FakeDbSet<Parent>();
parentsDbSet1.SetData(parents);
var parentsDbSet2 = new FakeDbSet<Parent>();
parentsDbSet2.SetData(parents);
parentsDbSet1.Setup(x => x.Include(It.IsAny<string>())).Returns(parentsDbSet2.Object);
// Can now test a method that does something like: context.Set<Parent>().Include("Children") etc
}
public class FakeDbSet<T> : Mock<DbSet<T>> where T : class
{
public void SetData(IEnumerable<T> data)
{
var mockDataQueryable = data.AsQueryable();
As<IQueryable<T>>().Setup(x => x.Provider).Returns(mockDataQueryable.Provider);
As<IQueryable<T>>().Setup(x => x.Expression).Returns(mockDataQueryable.Expression);
As<IQueryable<T>>().Setup(x => x.ElementType).Returns(mockDataQueryable.ElementType);
As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(mockDataQueryable.GetEnumerator());
}
}
Я действительно не люблю неуклюжесть того, чтобы иметь две поддельные DbSets, но по какой-то причине это не работает:
parentsDbSet1.Setup(x => x.Include(It.IsAny<string>())).Returns(parentsDbSet1.Object);
нибудь есть объяснение этому?
, который насмешливый каркас? вы пробовали «фальшивые рамки»? – daryal
Приношу свои извинения. Издевается над носорогами. –
Подождите, вы издеваетесь над DbContext или DbSet? –