我們以一個Student範例, 計算成績Score時有個CalculateScore()函數
public class Student
{
public Score CalculateScore()
{
Console.WriteLine("Calculate score");
TransferCourseDetail(CourseTypes.Major);
// next calculation flow
}
public void TransferCourseDetail(CourseTypes types)
{
//....
}
}
public class Student
{
public Score CalculateScore()
{
Console.WriteLine("Calculate score");
TransferCourseDetail(CourseTypes.Major);
// next calculation flow
}
public virtual void TransferCourseDetail(CourseTypes types)
{
CourseDetail.TransferDetail(types);
}
}
public class CourseDetail
{
public static void TransferDetail(CourseTypes types)
{
//....
}
}
從上面看到, 我們為TransferCourseDetail函數新增virtual修飾詞, 並將實作的邏輯,
移動到新的CourseDetail類別的TransferDetail函數.
因此, virtual void TransferCourseDetail成為一個Seam.
如果今天要維護一個沒有測試的程式碼, 或者要重構, 此時為了要確保程式邏輯能被驗證,
讓seam可以做替換功能, 驗證我們想先關注的部分.
回到上面的例子, 如果CalculateScore只是想先確認回傳的Score物件是符合"初步"預期,TransferDetail的實作可以先忽略, 那麼寫單元測試時, TransferDetail可以被override為空實作或者簡單的assertion.
另外CourseDetail也抽出獨立的TransferDetail函數, 也能單獨測試它的功能.
最終兩邊class的TransferDetail測試都完成, 後續再考慮使用哪些重構做改善.