簡體   English   中英

Moq:設置一個模擬方法在第一次調用時失敗,在第二次調用時成功

[英]Moq: Setup a mocked method to fail on the first call, succeed on the second

使用 Moq 模擬第一次調用將引發異常,然后在第二次調用時成功的方法的最簡潔方法是什么?

我會使用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();
}

從 Moq 4.2 開始,您可以只使用內置方法SetupSequence() (如 @RichardBarnett 評論所述)。

例子:

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

到目前為止,我想出的最好的是:

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 有一篇關於設置方法以返回特定結果序列的有趣博客文章 看起來這將是一個很好的起點,涉及一些工作,因為您現在需要的不是特定類型的值序列,而是可能是 T 類型或異常的結果序列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM