[英]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
您只需要在給定不同字符串輸入的情況下測試其行為即可。 至少為null
, string.Empty
和一些有效的string
。
您不能期望更改方法的實現會導致測試永不失敗。 實際上,您應該先更改測試以使其失敗,然后更改代碼以使測試通過,然后進行重構。 這稱為紅色,綠色重構周期。
似乎您的驗證器可能是更大工作的一部分,也許您真正感興趣的是在給定潛在驗證結果不同的情況下,其余代碼的行為方式。 在這種情況下,我建議您將驗證邏輯提取到一個單獨的類中,然后可以模擬該類的接口。 提供驗證器作為對需要它的代碼的依賴。 然后,在測試中,您可以提供以預定方式運行的模擬驗證器。 這樣,您可以編寫測試,而不必擔心將來對驗證器邏輯的更改會破壞它們。 這似乎是您問題的本質。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.