Носорог издевается:Как я могу создать макет метода, который преобразует входные данные?
-
09-06-2019 - |
Вопрос
У меня есть объект доступа к данным TransactionDao.Когда вы вызываете TransactionDao.Save(transaction), я бы хотел, чтобы он установил флаг транзакции.IsSaved=true (это упрощение, то, что я пытаюсь сделать, не так уж и банально).Итак, когда высмеиваете мой TransactionDao с помощью RhinoMocks, как я могу указать, что он должен преобразовать свои входные данные?
В идеале хотелось бы написать что-то вроде этого:
Expect.Call(delegate {dao.Save(transaction);}).Override(x => x.IsSaved=true);
Кто-нибудь знает как это сделать?
Хотя я получил подсказку, как это сделать, из ответа, указанного ниже, фактическая сигнатура типа отключена, вам нужно сделать что-то вроде этого:Судя по тому, что опубликовал Марк Ингрэм, лучший ответ, хотя никто этого прямо не сказал, — это сделать следующее:
public delegate void FakeSave(Transaction t);
...
Expect.Call(delegate {dao.Save(t); }).Do( new FakeSave(delegate(Transaction t2) { t.IsSaved = true; }));
Решение
Ущелье,
Самое простое решение, которое я нашел применительно к вашему вопросу, заключается в следующем:
Expect.Call(() => dao.Save(transaction))
.Do(new Action<Transaction>(x => x.IsSaved = true));
Поэтому вам не нужно создавать специального делегата или что-то еще.Просто используйте Action, который есть в стандартных библиотеках .NET 3.5.
Надеюсь, это поможет.Франтишек
Другие советы
Вы можете сделать это, используя обратный вызов Do:
Expect.Call(delegate {dao.Save(transaction);})
.Do(x => x.IsSaved = true);
вам следует издеваться над транзакцией и заставить ее возвращать true для IsSaved, если, конечно, вы можете издеваться над транзакцией.
ITransaction transaction = _Mocker.dynamicMock<ITransaction>;
Expect.Call(transaction.IsSaved).IgnoreArguments.Return(true);
_mocker.ReplayAll();
dao.Save(transaction);