Moq - 订购设置(期望)

Dav*_*iff 4 .net unit-testing moq

我是Moq的新手,无法确定我如何订购设置.我有以下代码:

_orderRepository.Setup(r => r.Update(It.Is<Order>(a => ((int)a.OrderStatusReference.EntityKey.EntityKeyValues[0].Value) == 2)))
                        .Throws(exception)
                        .AtMost(5);
Run Code Online (Sandbox Code Playgroud)

我想要执行5次(如果更新失败,则重试逻辑).在第5次之后我想设置并期望它成功(不抛出异常):

_orderRepository.Setup(r => r.Update(It.Is<Order>(a => ((int)a.OrderStatusReference.EntityKey.EntityKeyValues[0].Value) == 2))).AtMostOnce();
Run Code Online (Sandbox Code Playgroud)

不幸的是,它继续使用第一个代码示例,并且从未成功更新.

如果我没有使用Throws方法,那么我可以使用Callback方法,但是在throw之后它不可用:(.

如果有办法或者这是Moq的限制吗?

And*_*mes 16

巴...有办法!

您可以使用队列返回返回值列表(策略在此处解释得非常好:http://haacked.com/archive/2009/09/29/moq-sequences.aspx).

以下是该博客的示例:

如果你想要这个工作(它没有):

reader.Setup(r => r.Read()).Returns(true);
reader.Setup(r => r.Read()).Returns(true);
reader.Setup(r => r.Read()).Returns(false);
Run Code Online (Sandbox Code Playgroud)

只需这样做:

Queue listOfOperations = new Queue<bool>(new bool[] { true, true, false });

reader.Setup(r => r.Read())
  .Returns(() => listOfOperations.Dequeue());
Run Code Online (Sandbox Code Playgroud)

每次调用Read()时,都将使用Queue中的新值.

请享用!

  • .Returns(listOfOperations.Dequeue())应该是.Returns(()=> listOfOperations.Dequeue())或.Returns(listOfOperations.Dequeue)(缺少括号).否则,将.Read()的返回值绑定到listOfOperations.Dequeue()在绑定时返回的值,这将导致它每次都返回true,与您调用它的次数无关 (3认同)