我对[[NBuilder真的很陌生,但是它看起来很棒,所以我想我可以去了。我有一个DatabaseContext
,它像这样从DbContext
继承:
public class DatabaseContext : DbContext
现在,我已经创建了一个查询DatabaseContext
的服务,如下所示:
public async Task<List<Strategy>> Handle(StrategyList query, CancellationToken cancellationToken) { return _databaseContext.Strategies.ToList(); }
现在我要进行测试。我像这样设置上下文:
public class StrategyListContext { public readonly DatabaseContext DatabaseContext; private StrategyListContext() { DatabaseContext = CreateDatabaseContext(); } private DatabaseContext CreateDatabaseContext() { var dbContext = Substitute.For<DatabaseContext>(); var items = Builder<Strategy>.CreateListOfSize(10).Build(); dbContext.Strategies.ToList().Returns(items); return dbContext; } public static StrategyListContext GivenServices() => new StrategyListContext(); public StrategyListHandler WhenCreateHandler() => new StrategyListHandler(DatabaseContext); }
最重要的部分是CreateDatabaseContext
方法。就像这样:
private DatabaseContext CreateDatabaseContext() { var dbContext = Substitute.For<DatabaseContext>(); var items = Builder<Strategy>.CreateListOfSize(10).Build(); dbContext.Strategies.ToList().Returns(items); return dbContext; }
但是当我运行测试时,出现此错误:System.InvalidCastException:无法将类型为“ Castle.Proxies.ObjectProxy”的对象转换为类型为“ Microsoft.EntityFrameworkCore.Metadata.Internal.Model”。有人知道我能做些什么来使它正常工作吗?
所以我发现了这个问题:How do I mock DbContext using NSubstitute and then add/remove data并且我将方法更改为此:
private DatabaseContext CreateDatabaseContext() { var dbContext = Substitute.For<DatabaseContext>(); var items = Builder<Strategy>.CreateListOfSize(10).Build().AsQueryable(); var dbSet = Substitute.For<DbSet<Strategy>, IQueryable<Strategy>>(); ((IQueryable<Strategy>)dbSet).Provider.Returns(items.Provider); ((IQueryable<Strategy>)dbSet).Expression.Returns(items.Expression); ((IQueryable<Strategy>)dbSet).ElementType.Returns(items.ElementType); ((IQueryable<Strategy>)dbSet).GetEnumerator().Returns(items.GetEnumerator()); dbContext.Set<Strategy>().Returns(dbSet); return dbContext; }
但是我仍然遇到相同的错误。...
private static DatabaseContext CreateDatabaseContext()
{
var dbContext = Substitute.For<DatabaseContext>();
var items = Builder<Hall>.CreateListOfSize(10).Build().AsQueryable();
var dbSet = Substitute.For<DbSet<Hall>, IQueryable<Hall>>();
((IQueryable<Hall>)dbSet).Provider.Returns(items.Provider);
((IQueryable<Hall>)dbSet).Expression.Returns(items.Expression);
((IQueryable<Hall>)dbSet).ElementType.Returns(items.ElementType);
((IQueryable<Hall>)dbSet).GetEnumerator().Returns(items.GetEnumerator());
dbContext.Halls = dbSet;
return dbContext;
}
NB:指出:dbContext.Halls = dbSet
而不是dbContext.Set<Strategy>().Returns(dbSet);
的行>