Может ли Moq вернуть экземпляр реального объекта, переданный в метод установки, вызываемый в макете с типом возврата void?

#c# #moq

#c# #moq

Вопрос:

У меня есть вызов как таковой:

 _session.Setup(session => session.SaveOrUpdate(It.IsAny<Foo>()))
  

Я хочу получить копию любого экземпляра Foo , в который передается SaveOrUpdate при запуске теста для проверки. Как я могу получить точную копию этого Foo в свой тест?

Я пытался использовать .Callback , но, возможно, это не способ сделать это? Или, может быть, я делаю это неправильно… не уверен, но мне могла бы понадобиться помощь, чтобы выяснить, возможно ли это и как это сделать, пожалуйста.

 Foo foo;

_session.Setup(session => session.SaveOrUpdate(It.IsAny<Foo>()))
        .Callback<Foo>(fooInstanceBeingSaved => foo = fooInstanceBeingSaved as Foo);
  

В этом сценарии foo всегда возвращается null , даже если значение real foo на уровне сервиса заполнено.

РЕДАКТИРОВАТЬ: это не дубликат указанного дубликата, потому что этот вопрос отличается тем, что saveOrUpdate возвращает void . В сообщаемых повторяющихся статьях эти методы возвращают что-то отличное от void . Таким образом, мне нужно получить переменную из метода, в котором «Returns» не является допустимым параметром — что является решением в других статьях.

Комментарии:

1. Выглядит нормально. Вы уверены, что foo это значение равно null, потому что обратный вызов не вызывается? Или это потому as , что возвращается null ? Можете ли вы поставить точку останова в лямбде обратного вызова для проверки?

2. Да, foo возвращает значение null . Даже если я оставлю его как объект без какого-либо приведения / «как».

Ответ №1:

Здесь используются некоторые психические способности…

Похоже, вы можете использовать NHibernate , что, если это так, означает SaveOrUpdate , что имеет эту подпись:

 void SaveOrUpdate(object obj);
  

Итак, чтобы получить ваш Foo объект, вам нужно указать object в качестве параметра типа, например:

 _session.Setup(session => session.SaveOrUpdate(It.IsAny<object>()))
        .Callback<object>(objectBeingSaved => foo = objectBeingSaved as Foo);
  

Комментарии:

1. Ах, я раньше не думал менять IsAny<Foo> на IsAny<object> . Теперь это работает. Спасибо!