.net - parameter - Можете ли вы помочь мне понять Moq Callback?



mock setup return parameter value (4)

В дополнение к другим хорошим ответам здесь я использовал его для выполнения логики, прежде чем выбрасывать исключение. Например, мне нужно было сохранить все объекты, которые были переданы методу для последующей проверки, и этот метод (в некоторых тестовых случаях) должен был генерировать исключение. Вызов .Throws(...) в Mock.Setup(...) переопределяет действие Callback() и никогда не вызывает его. Однако, выбирая исключение в обратном вызове, вы все равно можете использовать все хорошие вещи, которые может предложить обратный вызов, и все же бросать исключение.

https://ffff65535.com

Используя Moq и посмотрев на Callback но я не смог найти простой пример, чтобы понять, как его использовать.

У вас есть небольшой рабочий фрагмент, который четко объясняет, как и когда его использовать?


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

var mock = new Mock<IDataService>();
DataEntity insertedEntity = null;

mock.Setup(x => x.Insert(It.IsAny<DataEntity>())).Returns(1) 
           .Callback((DataEntity de) => insertedEntity = de);

Синтаксис альтернативного обобщенного метода:

mock.Setup(x => x.Insert(It.IsAny<DataEntity>())).Returns(1) 
           .Callback<DataEntity>(de => insertedEntity = de);

Затем вы можете проверить что-то вроде

Assert.AreEqual("test", insertedEntity.Description, "Wrong Description");

Трудно побить https://github.com/Moq/moq4/wiki/Quickstart

Если это недостаточно ясно, я бы назвал это ошибкой doc ...

EDIT: В ответ на ваши разъяснения ...

Для каждого изнашиваемого метода Setup вы выполняете, вы можете указать такие вещи, как:

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

Механизм .Callback говорит: «Я не могу описать это прямо сейчас, но когда возникает такой звонок, позвоните мне, и я сделаю все, что нужно сделать». В рамках одной и той же безнадежной цепочки вызовов вы можете контролировать результат для возврата (если есть) через « .Returns ». В примерах QS примером является то, что они возвращают возвращаемое значение каждый раз.

В общем, вам не понадобится такой механизм, как это очень часто (xUnit Test Patterns имеет термины для antipatterns Ilk Conditional Logic In Tests), и если есть какой-либо более простой или встроенный способ установить, что вам нужно, это должно быть используется в предпочтении.

Часть 3 из 4 в серии Moq Justin Etheredge's покрывает его, и есть еще один пример обратных вызовов здесь


Callback вызов - это просто средство для выполнения любого настраиваемого кода, который вы хотите, когда вызов выполняется одним из методов макета. Вот простой пример:

public interface IFoo
{
    int Bar(bool b);
}

var mock = new Mock<IFoo>();

mock.Setup(mc => mc.Bar(It.IsAny<bool>()))
    .Callback<bool>(b => Console.WriteLine("Bar called with: " + b))
    .Returns(42);

var ret = mock.Object.Bar(true);
Console.WriteLine("Result: " + ret);

// output:
// Bar called with: True
// Result: 42

Недавно я столкнулся с интересным прецедентом. Предположим, вы ожидаете некоторых звонков на ваш макет, но они происходят одновременно. Таким образом, у вас нет способа узнать порядок, в котором они будут вызваны, но вы хотите знать, какие звонки, которые вы ожидали, имели место (независимо от порядка). Вы можете сделать что-то вроде этого:

var cq = new ConcurrentQueue<bool>();
mock.Setup(f => f.Bar(It.IsAny<bool>())).Callback<bool>(cq.Enqueue);
Parallel.Invoke(() => mock.Object.Bar(true), () => mock.Object.Bar(false));
Console.WriteLine("Invocations: " + String.Join(", ", cq));

// output:
// Invocations: True, False

BTW не путаются из-за вводящих в заблуждение различий «до Returns » и «после Returns ». Это просто техническое разграничение того, будет ли ваш пользовательский код работать после того, как Returns будет оценен или раньше. В глазах вызывающего, оба будут работать до возвращения значения. Действительно, если метод void вы не можете даже вызвать Returns и все же он работает одинаково. Для получения дополнительной информации см. .com/a/28727099/67824 .





moq