DbContext.Entities.FromSqlRaw не реализован? - PullRequest
0 голосов
/ 25 апреля 2020

(. Net core 3.1, EF core 3) У меня есть следующая настройка xUnit / Moq:

private readonly IDbContext _dbContext;

public MyTests()
{
    var contextMock = new Mock<IDbContext>();
    var dbSetMock = new List<MyEntity>
    {
        new MyEntity("...", "A"),
        new MyEntity("...", "B"),
        new MyEntity("...", "C"),
        new MyEntity("...", "D"),
    }.AsQueryable().BuildMockDbSet();
    contextMock.Setup(x => x.MyEntities).Returns(dbSetMock.Object);
    _dbContext = contextMock.Object;
}

public async Task GetValueTest()
{
    var sut = new GetValueQueryHandler(_dbContext);
    var result = await sut.Handle();
    result.IsSuccess.ShouldBeTrue();
}

И в функции GetValueQueryHandler.Handler() она вызывает

var ids = _dbContext.MyEntities.FromSqlRaw(sql);

Однако возникает ли ошибка?

Метод или операция не реализованы.

   at Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSqlOnQueryable[TEntity](IQueryable`1 source, String sql, Object[] parameters)
   at MockQueryable.TestAsyncEnumerable`1.CompileExpressionItem[TResult](Expression expression)
   at MockQueryable.TestAsyncEnumerable`1.System.Collections.Generic.IEnumerable.GetEnumerator()
   at Portal.Application.Restrictions.Queries.GetSymbolsAndTypes.GetSymbolsAndTypesQueryHandler.c__DisplayClass4_0.g__GetIds|0>d.MoveNext() 

1 Ответ

1 голос
/ 25 апреля 2020

Операции From Sql* являются реляционными операциями. Они предназначены для вызова в реляционном источнике данных.

Я предполагаю, что вы используете пакет MockQueryable для создания макетированного набора. Этот пакет является просто реализацией поставщика запросов asyn c enumerable / asyn c, он не поддерживает реляционные операции. Поставщик Microsoft in-memory также не поддерживает реляционные операции.

Я подозреваю, что вам потребуется библиотека, которая обеспечивает такую ​​поддержку. EntityFrameworkCore.Testing делает (отказ от ответственности, я автор), я считаю, что есть и другие.

...