【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);
}
這樣的寫法比起範例一更加簡單,甚至不需要拉出介面,能夠在改動較少程式碼的情況下達成單元測試。