Moq выдает исключения, в которых говорится, что дерево выражения не может содержать вызов или вызов, который использует необязательные аргументы. - PullRequest
0 голосов
/ 29 мая 2020

Я пишу тестовые примеры NUnit. Я пишу тестовые примеры, чтобы получить некоторые значения. Ниже приведены мои настройки.

[Test]
public async Task GetGeographyList_StateUnderTest_ExpectedBehavior()
{
    // Arrange
    var geographyBusinessLogic = this.CreateGeographyBusinessLogic();

    Geography geographyObj = new Geography() { Id = 101, Country = "India", Region = "APAC", SubRegion = "Asia South" };
    IEnumerable<Geography> geographyObjList =  new List<Geography>() { geographyObj };
    //this.geographyRepository.setupGetAsync<Geography>(geographyObjList);
    this.geographyRepository.Setup(
        x => x.GetAsync()).ReturnsAsync(geographyObjList);

    // Act
    var result = await geographyBusinessLogic.GetGeographyList();

    // Assert
    Assert.IsNotNull(result);
}

В приведенном выше коде x => x.GetAsync() выдает ошибку:

Дерево выражения не может содержать вызов или вызов, который использует необязательные аргументы

Ниже моя реализация geographyBusinessLogic.GetGeographyList():

public async Task<IEnumerable<GeographyEntity>> GetGeographyList()
{
    var listOfGeographies = await this.GeographyRepository.GetAsync().ConfigureAwait(false);

    IEnumerable<GeographyEntity> result = from o in listOfGeographies
                                          select new GeographyEntity
                                          {
                                            Id = o.Id,
                                            Country = o.Country,
                                            Region = o.Region,
                                            SubRegion = o.SubRegion
                                          };
    return result;
}

Ниже приведена реализация метода GetAsync:

public async Task<IEnumerable<T>> GetAsync(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, params Expression<Func<T, object>>[] includes)
{
    IQueryable<T> query = this.dbSet;
    foreach (Expression<Func<T, object>> include in includes)
    {
        query = query.Include(include);
    }

    if (filter != null)
    {
        query = query.Where(filter);
    }

    if (orderBy != null)
    {
        query = orderBy(query);
    }

    return await query.ToListAsync().ConfigureAwait(false);
}

Может кто-нибудь мне помочь поймите эту ошибку, и может ли кто-нибудь сказать мне, что мне здесь не хватает? Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 29 мая 2020

Вам необходимо заполнить все необязательные аргументы при настройке макета. Например:

this.geographyRepository.Setup(x => x.GetAsync(
    It.IsAny<Expression<Func<Geography, bool>>>(),
    It.IsAny<Func<IQueryable<Geography>, IOrderedQueryable<Geography>>>(),
    It.IsAny<Expression<Func<Geography, object>>[]>())).ReturnsAsync(geographyObjList);
...