NBuilder 和 DbContext 无效的强制转换问题



我是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"。

有谁知道我能做些什么来让它工作?


所以我发现了这个问题: 如何使用 NSubstitute 模拟 DbContext,然后添加/删除数据

我已将方法更改为:

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;
}

注意:表示:dbContext.Halls = dbSet而不是dbContext.Set<Strategy>().Returns(dbSet);的行

最新更新