【Unit Test】Stub破除依賴(四) - 抽取和重寫範例二
/
0 Comments
範例二和範例一的不同之處在於範例一是虛擬化工廠方法,而範例二是虛擬化回傳值。
將被測試方法中相依外部去取值的方法抽成一個virtual的方法,建立一個新類別(TestableMemberService)去繼承這個被測試類別(MemberService)並附寫此virtual方法,在測試時直接使用子類別(TestableMemberService)來操作,傳入你想預設的結果,如此可達到隔離外部回傳的資料影響你被測試方法的測試結果。
程式碼如下:
//原程式碼 public class MemberRepository { public string GetID(string name) { return "Original"; } } public class MemberService { public string GetMemberID(string name) { MemberRepository memberrepository = new MemberRepository(); return memberrepository.GetID(name); } } //重構後 public class MemberRepository { public string GetID(string name) { return "Original"; } } public class MemberService { protected virtual string GetID(string name) { MemberRepository mrp = new MemberRepository(); return mrp.GetID(name); } //被測試的方法 public string GetMemberID(string name) { return this.GetID(name); } } public class TestableMemberService : MemberService { private string _ID; protected override string GetID(string name) { return this._ID; } internal void SetID(string id) { this._ID = id; } }
測試程式碼 :
[TestMethod()] public void GetMemberID_Test() { //arrange var name = "Tom"; var id = "321"; TestableMemberService sut = new TestableMemberService(); sut.SetID(id); //act var actual = sut.GetMemberID(name); //assert Assert.AreEqual(id, actual); }
這樣的寫法比起範例一更加簡單,甚至不需要拉出介面,能夠在改動較少程式碼的情況下達成單元測試。