NBuilder и DbContext неверная проблема приведения - PullRequest
0 голосов
/ 25 января 2020

Я действительно новичок в NBuilder , но это выглядит потрясающе, поэтому я подумал, что у меня будет go. У меня есть 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».

Кто-нибудь знает, что я могу сделать, чтобы это работало?


Итак, я нашел это вопрос: Как мне смоделировать DbContext с помощью NSubstitute, а затем добавить / удалить данные

И я изменил свой метод следующим образом:

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

Но я все еще получаю та же ошибка ....

1 Ответ

0 голосов
/ 30 января 2020

Второе решение было так близко, оно было просто:

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

...