【Day 8】Unit Test應用:系統狀態修改
有時候我們不是檢查某個方法,只對其檢查回傳值true
或是false
,有時候會需要修改系統狀態,而測試系統的狀態是否如我們預期。
今天的範例也是使用LogAnalyzer
的功能,但是增加了一個新方法WasLastFileNameValid
,用來記錄上次檢查附檔名的時候是否有成功。
(本次是使用新專案,所以請參考專案【Day8】)
我們假設,當我們檢查檔案之後會修改某個參數,也就是更改系統狀態。舉例來說「當9:00時候」,就「進入看書模式」,所以當條件滿足「9:00」,我們的狀態就被修改成「看書」。這個也是相同道理,當檔名檢查通過,將會修改系統的狀態,也就是WasLastFileNameValid
的狀態。而我們今天要做的是檢查系統狀態。
首先在我們的程式LogAnalyzer.cs
中建立我們需要的變數方法,用來記錄檢查後的狀態。
public bool WasLastFileNameValid { get; set; }
接著是我們主要判斷的程式,這邊會先設定一個預設值(false)給我們的系統參數WasLastFileNameValid
,最後有通過檢查,就讓我們的參數變成true
,這樣就可以隨時調用這個系統狀態。
public bool IsValidLogFileName(string fileName)
{
WasLastFileNameValid = false; //Modify the system's status.
if (string.IsNullOrEmpty(fileName))
{
throw new ArgumentException("請提供檔名 please provide the filename");
}
if(!fileName.EndsWith(".log", StringComparison.CurrentCultureIgnoreCase))
{
return false;
}
//Doing the line means everything is correct.
//Therefore the system's status is "true".
WasLastFileNameValid = true; //modify the system's status
return true; //means: the function finishes.
}
這樣主要的程式功能就完成了。剩下就是測試的程式碼
首先建立一個工廠,方便呼叫。
private LogAnalyzer MakeAnalyzer()
{
return new LogAnalyzer();
}
接著建立我們要測試的functionIsValidLogFileName_WhenCalled_ChangeWasLastFileNameValid
。
public void IsValidLogFileName_WhenCalled_ChangeWasLastFileNameValid(string fileName, bool expectResult)
{
LogAnalyzer logAlr = MakeAnalyzer(); //Arrange //var: the target object.
logAlr.IsValidLogFileName(fileName); //Act //func:Do something and change the system's status.
Assert.AreEqual(expectResult, logAlr.WasLastFileNameValid); //Assert //check: the status is correct.
}
首先建立測試物件LogAnalyzer logAlr = MakeAnalyzer();
,接著進行測試,測試的變數如下:
[TestCase("Test.LOG", true)]
[TestCase("Test.log", true)]
[TestCase("Test.qoo", false)]
[TestCase("", false)]
這些變數會填入測試functionlogAlr.IsValidLogFileName(fileName);
中。
之後比對的就和先前城市不同,先前是直接拿結果回傳值做比對,這個範例則是使用自己的系統參數做比對,也就是取得logAlr.WasLastFileNameValid
的值來比對是否符合預期,因此斷言變成如此:
Assert.AreEqual(expectResult, logAlr.WasLastFileNameValid);
這樣就不是對原本的function進行結果比對,而是模擬一個系統狀態進行比對。是不是變得有趣多了呢?自己的測試內容不會受限於方法的回傳值,可以參照或測試自己想要的系統參數,來確保這樣的動作,這些參數有符合自己的預期做變化。