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

Я думаю, что могу быть немного смущен на синтаксисе Методов обратного вызова 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 может использоваться, прежде чем он будет инициализирован.

61
задан IAbstract 14 January 2014 в 18:10
поделиться

2 ответа

Это связано с тем, что код в методе 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>());
88
ответ дан 24 November 2019 в 17:18
поделиться

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

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

      return myFilteredFoos.Cast<IFooBar>();
    });
18
ответ дан 24 November 2019 в 17:18
поделиться
Другие вопросы по тегам:

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