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

问题描述 投票:0回答:1

我对[[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; }

但是我仍然遇到相同的错误。...
nunit dbcontext nsubstitute nbuilder
1个回答
0
投票
第二个解决方案太接近了,就是这样:

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);的行>
© www.soinside.com 2019 - 2024. All rights reserved.