簡體   English   中英

如何在 Moq 的 SetUpSequence 上使用回調?

[英]How to use Callback on Moq's SetUpSequence?

我正在使用 Moq 4.8 版,並且有一種方法可以模擬和斷言其參數。 我從這個模擬方法開始:

mock.Setup(m => m.Update(It.IsAny<MyClass>))
    .Callback((MyClass c) =>
    {
        // some assertions
    })
    .Returns(Task.FromResult(updatedClass));

我更新了一個MyClass類型的 object 並對該 object 進行了許多斷言。 這工作得很好。

我剛剛向調用Update的方法添加了邏輯,以便在拋出異常時重試調用它。 所以我想實現一個新的單元測試,它會拋出幾次異常然后返回並能夠像以前一樣進行斷言。 所以我嘗試了如下的SetupSequence

mock.SetupSequence(m => m.Update(It.IsAny<MyClass>))
    .Throws(new Exception("test exception 1"))
    .Throws(new Exception("test exception 2"))
    .Callback((MyClass c) =>
    {
        // some assertions
    })
    .Returns(Task.FromResult(updatedClass));

ISetupSequence不支持Callback 有沒有辦法按順序模擬ThrowsReturns調用,同時保持預調用CallbackReturns

暫時我一直在做這個作為解決方法:

int callCount = 0;
mock.Setup(m => m.Update(It.IsAny<MyClass>))
    .Callback((MyClass c) =>
    {
        callCount++;
        if (callCount <=2)
        {
            throw new Exception($"Test Exception #{callCount}");
        }
        else
        {
            callCount = 0; // this is needed if you're gonna use callCount for multiple setups
            // some assertions
        }
    })
    .Returns(Task.FromResult(updatedClass));

感覺像一個黑客,但做我正在尋找的。

您可以使用MockSequence ,以便在.Setup()之后添加 Callback 。

 var mock = new Mock<IFoo>(MockBehavior.Strict); var sequence = new MockSequence(); _fooService.InSequence(sequence).Setup(x => x.FooMethod(a)).ReturnsAsync(b); _barService.InSequence(sequence).Setup(x => x.BarMethod(c)).ReturnsAsync(d); _bazService.InSequence(sequence).Setup(x => x.BazMethod(e)).ReturnsAsync(f);

我已經使用這種方法來捕獲對方法的請求的每個實例,並返回一系列值。

var requests = new List<SomeRequest>();
var sequence = new MockSequence();
foreach (var response in responses)
{
    someMock.InSequence(sequence)
        .Setup(x => x.SomeMethod(It.IsAny<SomeRequest>()))
        .Callback<SomeRequest>(r => requests.Add(r))
        .ReturnsAsync(response);
}

給定一些預定義的響應列表,上面將捕獲對模擬方法發出的所有請求並返回響應序列。

暫無
暫無

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

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