with unit tests test setup objetos mock and c# unit-testing mocking nunit moq

c# - unit - verify moq



Moq: configurar un método burlado para fallar en la primera llamada, tener éxito en el segundo (4)

Haría uso de la Callback de Callback e incrementaré un contador para determinar si lanzo o no una excepción desde la Callback de Callback .

[Test] public void TestMe() { var count = 0; var mock = new Mock<IMyClass>(); mock.Setup(a => a.MyMethod()).Callback(() => { count++; if(count == 1) throw new ApplicationException(); }); Assert.Throws(typeof(ApplicationException), () => mock.Object.MyMethod()); Assert.DoesNotThrow(() => mock.Object.MyMethod()); } public interface IMyClass { void MyMethod(); }

¿Cuál es la forma más concisa de usar Moq para burlarse de un método que arrojará una excepción la primera vez que se invoca, y luego tendrá éxito la segunda vez que se llame?


Lo mejor que he encontrado hasta ahora es esto:

interface IFoo { void Bar(); } [Test] public void TestBarExceptionThenSuccess() { var repository = new MockRepository(MockBehavior.Default); var mock = repository.Create<IFoo>(); mock.Setup(m => m.Bar()). Callback(() => mock.Setup(m => m.Bar())). // Setup() replaces the initial one Throws<Exception>(); // throw an exception the first time ... }


Phil Haack tiene una interesante publicación en el blog sobre la configuración de un método para devolver una secuencia particular de resultados. Parece que sería un buen punto de partida, con algún trabajo involucrado, porque en lugar de una secuencia de valores de cierto tipo, necesitaría ahora tener una secuencia de resultados que podría ser de tipo T o una excepción.


Comenzando con Moq 4.2 puede simplemente usar el método SetupSequence() (como lo indica el comentario de @RichardBarnett).

Ejemplo:

var mock = new Mock<IMyClass>(); mock.SetupSequence(x => x.MyMethod("param1")) .Throws<MyException>() .Returns("test return");