Я думаю, что могу быть немного смущен на синтаксисе Методов обратного вызова Moq. Когда я пытаюсь сделать что-то вроде этого:
IFilter filter = new Filter();
List<IFoo> objects = new List<IFoo> { new Foo(), new Foo() };
IQueryable myFilteredFoos = null;
mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
.Callback( (IFilter filter) => myFilteredFoos = filter.FilterCollection(objects))
.Returns(myFilteredFoos.Cast<IFooBar>());
Это выдает исключение потому что myFilteredFoos
является пустым во время Cast<IFooBar>()
звонить. Разве это не работает, как я ожидаю? Я думал бы FilterCollection
был бы назван и затем myFilteredFoos
было бы непустым и допускал бы бросок.
FilterCollection
не способно к возврату пустого указателя, который привлекает меня к заключению, которым это не называют. Кроме того, когда я объявляю myFilteredFoos
как это:
Queryable myFilteredFoos;
Ответный визит жалуется, что myFilteredFoos может использоваться, прежде чем он будет инициализирован.
Это связано с тем, что код в методе Returns
оценивается немедленно; то есть, когда вызывается метод Setup
.
Однако обратный вызов не вызывается до тех пор, пока не будет вызван метод GetByFilter
.
К счастью, метод Returns
перегружен, поэтому вы также можете отложить его выполнение:
mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
.Callback((IFilter filter) =>
myFilteredFoos = filter.FilterCollection(objects))
.Returns(() => myFilteredFoos.Cast<IFooBar>());
Однако вам не нужно сохранять значение в обратном вызове, потому что вы можете просто получить значение параметра непосредственно в методе Возвращает
:
mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
.Returns((IFilter filter) =>
filter.FilterCollection(objects).Cast<IFooBar>());
Вы можете просто взять параметр в возвращаемом значении ...
mockObject
.Setup(m => m.GetByFilter(It.IsAny<IFilter>()))
.Returns((IFilter filter) =>
{
myFilteredFoos = filter.FilterCollection(objects);
return myFilteredFoos.Cast<IFooBar>();
});