簡體   English   中英

我可以使用 Moq 的 SetupSequence 拋出異常然后返回 void 嗎?

[英]Can I use Moq's SetupSequence to throw exception then return void?

我試圖設置 Moq 在第一次調用時拋出異常,然后在第二次調用時返回 void。 我嘲笑的方法有一個void返回類型(例如public void Bar() )。

我嘗試過的事情

這有編譯錯誤,因為Returns需要一個參數,而SetupSequence需要類型參數。

_mock.SetupSequence(m => m.Bar())
    .Throws<Exception>()
    .Returns();

這有一個編譯錯誤,因為Void不是 C# 中的類型。

_mock.SetupSequence<IMyMock, Void>(m => m.Bar())
    .Throws<Exception>() // first invocation throws exception
    .CallBase();

解決方法

最后我放棄了SetupSequence()並切換到Callback()拋出異常。

var firstTime = true;
_mock.Setup(m => m.Bar())
    .Callback(() =>
    {
        if (firstTime)
        {
            firstTime = false;
            throw new Exception();
        }
    });

問題

SetupSequence采用Func ,而不是Action 我是否正確假設這意味着SetupSequence()不能用於模擬 void 方法?

您可以從 Moq 4.8.0 開始執行此操作:

在 GitHub 問題#451討論了對void方法的SetupSequence支持,並添加了 GitHub pull request #463

您可能正在尋找新的.Pass()方法:

mock.SetupSequence(m => m.VoidMethod())
    .Throws(new InvalidOperationException())
    .Pass()
    .Pass()
    .Throws(new InvalidOperationException())
    .Pass();

請注意,對.Pass()尾隨調用可能是不必要的。

暫無
暫無

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

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