Я действительно новичок в 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;
}
Но я все еще получаю та же ошибка ....