我对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;
}但是当我运行测试时,我得到了这个错误:
'Microsoft.EntityFrameworkCore.Metadata.Internal.Model'. System.InvalidCastException :无法将“Castle.Proxies.ObjectProxy”类型的对象强制转换为
有人知道我能做些什么吗?
所以我发现了一个问题: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;
}但我还是犯了同样的错误..。
发布于 2020-01-30 16:41:04
第二个解决方案太接近了,很简单:
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;
}注:这一行写着:dbContext.Halls = dbSet而不是dbContext.Set<Strategy>().Returns(dbSet);
https://stackoverflow.com/questions/59913264
复制相似问题