最简洁的方法是使用Moq来模拟一个方法,该方法在第一次调用时会抛出异常,然后在第二次调用它时成功?
答案 0 :(得分:46)
我会使用Callback
并增加一个计数器来确定是否从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();
}
答案 1 :(得分:16)
到目前为止,我提出的最好的是:
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
...
}
答案 2 :(得分:15)
从Moq 4.2开始,您可以使用内置方法SetupSequence()
(如@RichardBarnett评论所述)。
示例:
var mock = new Mock<IMyClass>();
mock.SetupSequence(x => x.MyMethod("param1"))
.Throws<MyException>()
.Returns("test return");
答案 3 :(得分:5)