verifiable setup objetos mock dotnet c# unit-testing mocking methods moq

c# - setup - Métodos anulados de "cortocircuito" con Moq?



objetos mock c# (1)

Si el método SaveItem() es virtual o abstracto, y no está configurando Callbase = true , entonces el método debería volver a implementarse para no hacer nada mediante el simulacro.

Deberías poder hacer:

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).Verifiable(); ... test here ... mockDb.Verify();

Mi equipo tomó la decisión recientemente de usar Moq como nuestro marco burlón por su gran flexibilidad y sintaxis altamente legible. Como somos nuevos en esto, me estoy tropezando 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 estén obligadas a tener una conexión en vivo. Un método particular:

  • Aplica alguna lógica de "negocios"
  • Si corresponde, invoca una llamada a SDB a través de un proveedor que hemos creado, llamémoslo SaveItem()

Quiero probar esto de manera tal que configuremos el contexto requerido y SaveItem() que SaveItem() fue invocado, pero de una manera que SaveItem() realmente no es invocado (porque A) el proveedor de SDB es un simulacro que no es totalmente hidratado y probablemente bombardee y B) No quiero tener que pagar por esa transacción cientos y miles de veces).

Cuando se trata de métodos que devolvieron un valor, esto fue trivial.

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

Sin embargo, en el caso que SaveItem() anteriormente, mi SaveItem() " SaveItem() " es nulo y, por lo tanto, la opción de usar el método de Returns() de Moq Returns() no está disponible. Y aunque puedo configurar una devolución de llamada para verificar que se SaveItem() , parece que no puedo lograr que no haga nada.

Ingenuo / esperanzado, pensé que lo siguiente funcionaría, pero parece que todavía invoco 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();