撰寫一個單元測試的目的在「驗證」一個單元的正確性(癈話!!),因此,單元測試可以說就是模擬客戶端呼叫方法,並確認客戶端在意的預期結果是否與呼叫結果吻合的過程。
對於客戶端可能在意的預期結果可以區分為三類,分別是呼叫方法的回傳值、呼叫方法後物件的狀態及呼叫方法所屬物件與其他物件的互動情形。
透過傳入不同定義域的的代表性樣本值來確認值域是否符合預期,藉以確認函式的處理邏輯是否符合預期,後面透過一個 IPeople 介面,定義 Ask 、 Eat 及 Recevie 三個不同方法,針對不同的情景建立對應的案例及測試實做示例。
呼叫方法的回傳值
Ask 方法
Ask 方法示範對於具有回傳值的處理的測試撰寫方式。
商業邏輯
人聽到提問會回覆答案。
案例
松下問童子,言師採藥去
Gherkin
Given 問題 "林老師哩?"
When 詢問樹下童子
Then 得到回應 "採藥去"
實做
[TestMethod]
public void Test_函式回傳值()
{
//Arrange
var sQuestion = "林老師哩?";
//Act
var objChild = (IPeople)new Child();
var sAnswer = objChild.Ask(sQuestion);
//Assert
Assert.AreEqual("採藥去", sAnswer);
}
呼叫方式後物件的改變
Eat 方法
Eat 方法示範處理前後物件屬性值的改變的測試。
商業邏輯
人吃多少重量的食物則體重就會增加多少。
案例
有一位 100 公斤的客人點了一塊 2公斤的牛排當晚餐,這個客人吃完後體重應為 102 公斤。
Gherkin
Given 一塊 2 公斤的牛排的晚餐
When 體重 100 公斤的客戶吃完
Then 客戶體重為 102 公斤
實做
[TestMethod]
public void Test_物件的屬性值()
{
//Arrange
var objDiner = (IFood)new Meet(2);
//Act
var objClient = (IPeople)new Customer(100);
objClient.Eat(objDiner);
//Assert
Assert.IsTrue(objClient.Weight == 102);
}
呼叫方法時方法所屬物件與其他物件間的互動情形
Recevie 方法
Recevie 方法示範驗證處理過程中物件互動的測試撰寫方式。
商業邏輯
人會將收到的工作推給其他人。
案例
經理收到的工作後會轉給所屬工程師。
Gherkin
Given 工程師
When 經理接收到一項工作
Then 工程師會被呼叫執行
實做
[TestMethod]
public void Test_物件間的互動()
{
var objEngineer = new StubEngineer();
var objTask = new Task();
var objManager = new Manager();
objManager.Subordinate.Add(objEngineer);
((IPeople)objManager).Receive(objTask);
Assert.IsTure(objEngineer.RunJobMethodCalled())
}