Метод Moq, использующий лямбду и проверяющий его возврат - PullRequest
0 голосов
/ 06 марта 2020

В предложенном ответе используется It.IsAny <>, который, как нам известно, фирма обязана не использовать.

Итак, я пытаюсь проверить Expression<Func<Foo, bool>> и запустить его для своей коллекции:

Expression<Func<Foo, bool>> testExpression = exp =>
    exp.Bars.Any(a => a.Bar.BarString == barString);

_fooRepository.Setup(f => f.GetAllListAsync(It.Is<Expression<Func<Foo, bool>>> 
   (exp => exp == testExpression)))
.Returns(Task.FromResult(fooList.Where(testExpression.Compile()).ToList()))
.Verifiable();

Я сделал несколько попыток ответа, но перегрузка возврата предикатом не дает я не могу выполнить его по моему строго типизированному списку.


У меня есть метод, который принимает строку и выполняет лямбду над хранилищем, чтобы получить все совпадающие экземпляры (но ожидающие только одного).

Например:

    var foo = await _fooRepository.GetAllListAsync(
        f => f.Bars.Any(b => b.Bar.BarString == barString));

Существует некоторая проверка, которая гарантирует, что фактически только один был возвращен - затем возвращается свойство foo (скажем, fooId).

Что У меня проблемы с, настраивает ли макет, где я могу проверить - учитывая список Foo, лямбда-ответ возвращает ожидаемые результаты?

Мой тест в этот момент довольно взломан (я переписывал и работал над этим слишком долго):

const string fooId = "fooId";
const string barString = "barString";
var fooList = new List<FooList>()
{
    new Foo()
    {
        FooId = fooId,
        Bars = new List<FooBar>()
        {
            new FooBar()
            {
                Bar = new Bar()
                {
                    BarString = barString
                }
            }
        }
    },
    new Foo()
    {
        FooId = "other foo",
        Bars = new List<FooBar>()
        {
            new FooBar()
            {
                Bar = new Bar()
                {
                    BarString = "other bars"
                }
            }
        }
    }

};

_fooRepository.Setup(f => f.GetAllListAsync(It.IsAny<Expression<Func<Foo, bool>>>()))
    .Returns(Task.FromResult(fooList))
    .Verifiable();

Я пытался создать ожидаемое выражение с помощью:

Expression<Func<Foo, bool>> expectedExpression = exp => 

И вот где я зависаю - потому что я не может создать выражение без пота. Я не уверен, как заставить мой fooList выполнять выражение над ним.

Я видел несколько примеров использования лямбды в методе .Returns () - но это не тот путь, по которому я хочу идти, потому что я хочу протестировать метод , не лямбда, я даю тест.

Любое направление будет с благодарностью.

1 Ответ

0 голосов
/ 06 марта 2020

Чего мне не хватало, так это того, что мне приходилось передавать ожидаемые результаты всей итерации.

Например:

var fooList = new List<FooList>()
{
    new Foo()
    {
        FooId = fooId,
        Bars = new List<FooBar>()
        {
            new FooBar()
            {
                Bar = new Bar()
                {
                    BarString = barString
                }
            }
        }
    },
    new Foo()
    {
        FooId = "other foo",
        Bars = new List<FooBar>()
        {
            new FooBar()
            {
                Bar = new Bar()
                {
                    BarString = "other bars"
                }
            }
        }
    }

};

Затем мне нужно было объявить итерацию с ожидаемыми результатами. :

Func<Expression<Func<Foo, bool>>, bool> exprIsGood = expr => 
{
    var func = expr.Compile();

    return func(fooList[0])
        && !func(fooList[1]);
};

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

_fooRepository.Setup(
    f => f.GetAllListAsync(
        It.Is<Expression<Func<Foo, bool>>>(exp => exprIsGood(exp))))
    .Returns(Task.FromResult(new List<Foo> { fooList[0] }))
    .Verifiable();
...