首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NBuilder和DbContext无效的强制转换问题

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

Stack Overflow用户
提问于 2020-01-25 20:47:08
回答 1查看 75关注 0票数 0

我对NBuilder真的很陌生,但它看起来很棒,所以我想我应该试一试。我有一个DatabaseContext,它是从DbContext继承的,如下所示:

代码语言:javascript
复制
public class DatabaseContext : DbContext

现在,我创建了一个像这样查询DatabaseContext的服务:

代码语言:javascript
复制
public async Task<List<Strategy>> Handle(StrategyList query, CancellationToken cancellationToken)
{
    return _databaseContext.Strategies.ToList();
}

现在我想做个测试。我把这个上下文设置成这样:

代码语言:javascript
复制
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方法。它是这样的:

代码语言:javascript
复制
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

我已经改变了我的方法

代码语言:javascript
复制
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;
}

但我还是犯了同样的错误..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-30 16:41:04

第二个解决方案太接近了,很简单:

代码语言:javascript
复制
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);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59913264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档