¿Cómo borrar las expectativas previas sobre un objeto?

Me gustaría configurar un valor de retorno

_stubRepository.Stub(Contains(null)).IgnoreArguments().Return(true); 

pero luego en una prueba específica, anula esa expectativa de devolver falso.

Algo como:

 _stubRepository.ClearExpectations(); //<- this does not exist, I'm just making something up _stubRepository.Stub(Contains(null)).IgnoreArguments().Return(false); 

Aviso, no quiero que la expectativa sea falsa en la segunda llamada, quiero anular la primera expectativa.

Esto ayudaría a simplificar mi escenario de prueba en gran medida.

Hay tres formas:

Puede restablecer las expectativas utilizando BackToRecord

Debo admitir que nunca lo usé porque es incómodo.

 // clear expectations, an enum defines which _stubRepository.BackToRecord(BackToRecordOptions.All); // go to replay again. _stubRepository.Replay(); 

Editar: Ahora lo uso a veces, en realidad es la forma más limpia. Debería haber un método de extensión (como Stub) que lo haga, creo que simplemente se olvidó. Sugeriría que escribas el tuyo.

Puede usar Repeat.Any ()

‘Rompe’ el orden de la definición trobada y “anula” las definiciones anteriores. Pero de alguna manera está implícito. Lo uso a veces porque es fácil de escribir.

 _stubRepository.Stub(x => x.Contains(null)) .IgnoreArguments() .Return(false) .Repeat.Any(); 

Puedes crear un nuevo simulacro

Trivial, pero explícito y fácil de entender. Solo es un problema si desea mantener muchas definiciones y solo cambiar una llamada.

 _stubRepository = MockRepository.GenerateMock(); _stubRepository.Stub(x => x.Contains(null)) .IgnoreArguments() .Return(false); 

Para estas situaciones, creé un método simple de extensión de RinoMocks para mostrar mejor la intención del apéndice y promover la legibilidad.

 public static void OverridePrevious(this IMethodOptions options) { options.Repeat.Any(); } 

Entonces, en lugar de una llamada críptica como la siguiente, puede requerir un comentario:

 [SetUp] public void Setup() { carStub.Stub(x => x.Model).Return("Model1"); carStub.Stub(x => x.Model).Return("Model2"); } [Test] public void SomeTest() { //Arrange //overrides previous stubs that were setup for the Model property carStub.Stub(x => x.Model).Return(null).Repeat.Any(); //Act //Assert } 

Puede obtener una prueba más legible que muestre mejor el propósito de las llamadas .Repeat.Any ():

 carStub.Stub(x => x.Model).Return(null).OverridePrevious(); 

Por el bien de la comunidad, agregaré esto para agregarlo a la lista de opciones de Stefan anterior:

Si el valor de retorno debe cambiarse con frecuencia, me resulta limpio y eficiente utilizar un cierre de la siguiente manera.

 bool returnValue = true; _stubRepository.Stub(x => x.Contains(null)).IgnoreArguments().Do(new Func(() => { return returnValue; })); returnValue = false; // Calls to Contains now return false; returnValue = true; // Calls to Contains now return true; 

La expresión lambda se ejecutará cada vez que se llame a Contains y porque creamos un cierre haciendo referencia a returnValue , siempre buscará el valor actual de returnValue .