Значения параметров настройки в вызове Moq Callback ()

Я думаю, что я могу немного смутить синтаксис методов обратного вызова Moq. Когда я пытаюсь сделать что-то вроде этого:

IFilter filter = new Filter(); List objects = new List { new Foo(), new Foo() }; IQueryable myFilteredFoos = null; mockObject.Setup(m => m.GetByFilter(It.IsAny())) .Callback( (IFilter filter) => myFilteredFoos = filter.FilterCollection(objects)) .Returns(myFilteredFoos.Cast()); 

Это вызывает исключение, поскольку myFilteredFoos имеет значение null во время Cast() . Неужели это не работает, как я ожидаю? Я бы подумал, что FilterCollection будет вызываться, а myFilteredFoos будет не нулевым и позволит выполнить трансляцию.

FilterCollection не может возвращать нуль, который привлекает меня к выводу, который он не вызывается. Кроме того, когда я объявляю myFilteredFoos следующим образом:

 Queryable myFilteredFoos; 

Обратный вызов жалуется, что myFilteredFoos можно использовать до его инициализации.

Это связано с тем, что код метода Returns сразу оценивается; то есть при вызове метода Setup .

Однако обратный вызов не вызывается до тех пор, пока не будет вызван метод GetByFilter .

К счастью, метод Returns перегружен, так что вы также можете отложить его выполнение:

 mockObject.Setup(m => m.GetByFilter(It.IsAny())) .Callback((IFilter filter) => myFilteredFoos = filter.FilterCollection(objects)) .Returns(() => myFilteredFoos.Cast()); 

Однако вам не нужно сохранять значение в обратном вызове, потому что вы можете просто получить значение параметра непосредственно в методе Returns :

 mockObject.Setup(m => m.GetByFilter(It.IsAny())) .Returns((IFilter filter) => filter.FilterCollection(objects).Cast()); 

Вы можете просто взять параметр в возвращаемом значении …

 mockObject .Setup(m => m.GetByFilter(It.IsAny())) .Returns((IFilter filter) => { myFilteredFoos = filter.FilterCollection(objects); return myFilteredFoos.Cast(); });