Moq. Насмешка <T> - как настроить метод, который берет выражение

Если число всегда начинается с + и вы хотите получить полный номер без него, используйте:

\+(\d+(?:\s\d+)*)\b

и оно вернется (из вашего примера): 12 555 660 000

См. Онлайн: https://regex101.com/r/aEeIgK/2

Объяснение:

  • \+ начать с определения + перед началом нашего матча. Экранирование как + - это квантор регулярного выражения.
  • \b оканчиваются границей слова (поэтому, если смешанная строка начинается с цифр, она не будет частью совпадения).
  • (\d+(?:\s\d+)*) с круглыми скобками (...) - это то, что будет совпадать.
    • \d+ одна или несколько цифр в начале - это мачта. \d является цифрой; + квантификатор для одного или нескольких.
    • (?:\s\d+)* необязательные (ноль или более) строки, начинающиеся с пробела \s, за которыми следуют цифры.
    • (?:...) - это несоответствие скобок.
    • * квантификатор для нуля или более.
    • \s пробел (только один).

29
задан Boann 28 July 2019 в 17:58
поделиться

3 ответа

Вы можете настроить его следующим образом:

_mockRepos.Setup(x => x.Single<Page>(It.IsAny<Expression<Func<Page, bool>>>()))//.Returns etc...;

Однако вы сталкиваетесь с одним из недостатков Moq. Вы бы хотели поместить туда действительное выражение вместо использования It.IsAny, но Moq не поддерживает установку методов, которые принимают выражения с конкретными выражениями (это трудно реализуемая возможность). Сложность возникает из-за необходимости выяснить, эквивалентны ли два выражения.

Поэтому в вашем тесте вы можете передать any Expression> и он передаст обратно все, что вы настроили mock на возврат. Значение теста немного размыто.

41
ответ дан 28 November 2019 в 01:30
поделиться

Пусть вызов .Returns возвращает результат выражения для вашей переменной allPages.

_mockRepos.Setup(x => x.Single<Page>(It.IsAny<Expression<Func<Page, bool>>>()))
    .Returns( (Expression<Func<Page, bool>> predicate) => allPages.Where(predicate) );
8
ответ дан wllmsaccnt 28 November 2019 в 01:30
поделиться

Использование It.IsAny<> Moq без .CallBack вынуждает вас писать код, который не охватывается вашим тестом. Вместо этого он позволяет любому запросу / выражению вообще проходить, делая ваш макет практически бесполезным с точки зрения модульного тестирования.

Решение: вам нужно либо использовать Обратный вызов для проверки выражения, либо вам нужно лучше ограничить свой макет. В любом случае это грязно и сложно. Я занимался этим вопросом до тех пор, пока я практикую TDD. Я наконец собрал вспомогательный класс, чтобы сделать его более выразительным и менее запутанным. Вот пример одного возможного конечного результата:

mockPeopleRepository
  .Setup(x => x.Find(ThatHas.AnExpressionFor<Person>()
    .ThatMatches(correctPerson)
    .And().ThatDoesNotMatch(deletedPerson)
    .Build()))
  .Returns(_expectedListOfPeople); 

Вот статья в блоге, в которой говорится об этом и дается исходный код: http://awkwardcoder.com/2013/04/24/ сдерживающими-издевается-с-выражение-аргументы /

1
ответ дан Byron Sommardahl 28 November 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: