【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);
}

這樣的寫法比起範例一更加簡單,甚至不需要拉出介面,能夠在改動較少程式碼的情況下達成單元測試。


You may also like

沒有留言: