【Unit Test】使用Stub破除依賴(三)
/
0 Comments
前言:
這篇說明的是 "在方法被呼叫前注入偽對象",配合使用工廠模式來達成。延續上一篇的例子,只是這次不用在MemberService的建構子傳入參數,而是透過工廠模式來返回Stub物件(實作IMemberRepository的Stub)。
程式碼如下:
//原程式碼
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 : IMemberRepository
{
public string GetID(string name)
{
return "Original";
}
}
public class MemberService
{
private IMemberRepository _IMemberRepository;
public MemberService()
{
//呼叫工廠
this._IMemberRepository = MemberRepositoryFactory.Create();
}
//被測試的方法
public string GetMemberID(string name)
{
return this._IMemberRepository.GetID(name);
}
}
public interface IMemberRepository
{
string GetID(string name);
}
//工廠方法
public class MemberRepositoryFactory
{
private static IMemberRepository repository = null;
public static IMemberRepository Create()
{
if (repository != null)
{
return repository;
}
return new MemberRepository();
}
public static void SetRepository(IMemberRepository mrp)
{
repository = mrp;
}
}
測試程式碼 :
//Stub
public class FakeMemberRepository : IMemberRepository
{
public string returnID { get; set; }
public string GetID(string name)
{
return returnID;
}
}
[TestMethod()]
public void GetMemberID_Test()
{
//arrange
var name = "Tom";
var expected = "321";
var imr = new FakeMemberRepository();
imr.returnID = expected;
MemberRepositoryFactory.SetRepository(imr);
MemberService sut = new MemberService();
//act
var actual = sut.GetMemberID(name);
//assert
Assert.AreEqual(expected, actual);
}