Burlas de rinoceronte:¿Cómo puedo simular un método que transforma su entrada?

StackOverflow https://stackoverflow.com/questions/59396

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo un objeto de acceso a datos TransactionDao.Cuando llamas a TransactionDao.Save(transaction), me gustaría que establezca un indicador transaction.IsSaved=true (esto es una simplificación, lo que estoy tratando de hacer no es tan banal).Entonces, cuando me burlo de mi TransactionDao con RhinoMocks, ¿cómo puedo indicar que debería transformar su entrada?

Lo ideal sería escribir algo como esto:

Expect.Call(delegate {dao.Save(transaction);}).Override(x => x.IsSaved=true);

¿Alguien sabe como hacer esto?


Aunque obtuve una pista de cómo hacerlo a partir de la respuesta especificada a continuación, la firma de tipo real está desactivada, debes hacer algo como esto:Debido a lo que publicó Mark Ingram, parece que la mejor respuesta, aunque nadie lo ha dicho explícitamente, es hacer esto:

public delegate void FakeSave(Transaction t);
...
Expect.Call(delegate {dao.Save(t); }).Do( new FakeSave(delegate(Transaction t2) { t.IsSaved = true; }));
¿Fue útil?

Solución

Garganta,

La solución más simple que encontré aplicada a su pregunta es la siguiente:

Expect.Call(() => dao.Save(transaction))
    .Do(new Action<Transaction>(x => x.IsSaved = true));

Por lo tanto, no es necesario crear un delegado especial ni nada más.Simplemente use Action que se encuentra en las bibliotecas estándar .NET 3.5.

Espero que esto ayude.Frantisek

Otros consejos

Puedes lograr esto usando la devolución de llamada Do:

Expect.Call(delegate {dao.Save(transaction);})
    .Do(x => x.IsSaved = true);

debe burlarse de la transacción y hacer que vuelva a ser verdadero para IsSaved, si puede burlarse de la transacción, por supuesto.

ITransaction transaction = _Mocker.dynamicMock<ITransaction>;
Expect.Call(transaction.IsSaved).IgnoreArguments.Return(true);
_mocker.ReplayAll();
dao.Save(transaction);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top