¿Métodos vacíos de “cortocircuito” con Moq?

mi equipo ha tomado la decisión recientemente de usar Moq como nuestro marco de burla por su tremenda flexibilidad y su sintaxis de fácil lectura. Como somos nuevos en esto, me tropiezo con lo que parecen ser preguntas simples: las búsquedas (aquí, Google, etc.) encuentran muchas discusiones sobre otros matices de Moq, pero no necesariamente lo que busco, y Las pocas preguntas aparentemente relacionadas se han convertido en pistas falsas.

Estamos probando una clase que tiene una dependencia externa (Amazon SimpleDb para ser precisos) pero no queremos que nuestras pruebas se vean obligadas a tener una conexión activa. Un método particular:

Aplica alguna lógica de "negocio".Si corresponde, invoca una llamada a SDB a través de un proveedor que hemos creado, llamémosloSaveItem()

Quiero hacer una prueba de unidad de tal manera que configuremos el contexto requerido y aseguremos queSaveItem() fue invocado, pero de una manera queSaveItem() realmente no se invoca (porque A) el proveedor a SDB es un simulacro que no está completamente hidratado y probablemente bombardee y B) No quiero tener que pagar por esa transacción cientos y miles de veces).

Cuando se trataba de métodos que devolvían un valor, esto era trivial.

mockDb.Setup(d => d.GiveMeSomething()).Returns("Foo");

En el caso que describo arriba sin embargo, mi "SaveItem()"el método es nulo y por lo tanto la opción de usar Moq'sReturns() El método no está disponible. Y mientras puedo configurar una devolución de llamada para verificarSaveItem() se invoca, sin embargo no puedo lograr que no haga nada.

Ingenuo / esperanzado, pensé que lo siguiente funcionaría, pero parece que aún invoca el método:

mockDb.Setup(d => d.SaveItem(It.IsAny<object>()));

Entonces la pregunta del millón: ¿Cuál es el Moq del siguiente código ficticio?

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).STOP_RIGHT_HERE();

Respuestas a la pregunta(1)

Su respuesta a la pregunta