簡體   English   中英

如何在Moq中模擬字符串類

[英]How to mock string class in Moq

我有一個像這樣的測試方法

[Test]
public void VerifyRedirectedTempCodeWithAnEmptyString()
{
    var mockStringLength = new Mock<string>();
    mockStringLength.Setup(x => x.Length).Returns(0);
    Boolean returnValue = VerifyRedirectedTempCode(mockStringLength.Object);
    Assert.AreEqual(returnValue, false);
}

沒有編譯錯誤,但是當我運行此測試時,它給出了System.NotSupportedException:要模擬的類型必須是接口或抽象或非密封類。 這是我的實際方法

    public virtual Boolean VerifyRedirectedTempCode(string tempAuthCode)
    {
        if (tempAuthCode != null && tempAuthCode.Length > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

因此,如何模擬string.length屬性,以便即使將來他們更新length方法也不會影響我的測試方法。 如何嘲笑?

您無需在此處模擬字符串長度。 您要測試的方法需要一個整數,因此只需將其傳遞給整數即可! 如果確實需要,可以將其傳遞給string.Empty.Length ,以防在將來的框架版本中發生更改。

使用單元測試,您可以根據輸入和依賴狀態來測試方法的行為。 如果您的方法接受一個int並返回一個bool那么測試它所需要做的就是傳遞一個int 該方法不應該在意它的來源。 這是關注點分離的問題。


更新之后,給定您的方法使用一個string您只需要在給定不同字符串輸入的情況下測試其行為即可。 至少為nullstring.Empty和一些有效的string

您不能期望更改方法的實現會導致測試永不失敗。 實際上,您應該先更改測試以使其失敗,然后更改代碼以使測試通過,然后進行重構。 這稱為紅色,綠色重構周期。


似乎您的驗證器可能是更大工作的一部分,也許您真正感興趣的是在給定潛在驗證結果不同的情況下,其余代碼的行為方式。 在這種情況下,我建議您將驗證邏輯提取到一個單獨的類中,然后可以模擬該類的接口。 提供驗證器作為對需要它的代碼的依賴。 然后,在測試中,您可以提供以預定方式運行的模擬驗證器。 這樣,您可以編寫測試,而不必擔心將來對驗證器邏輯的更改會破壞它們。 這似乎是您問題的本質。

暫無
暫無

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

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