單元測試
稍微記錄一下平常使用Extract and Override的技巧
這一支程式是一個帳單進行付款的行為,但要先進行客戶的資料基本檢驗,但是相依了Customer,要如何測試這一段程式碼, 因為原始程式碼相依耦合性依賴相當高,這會讓測試不好測試,最好的方式就是重構成Interface,但現實專案當中確實很難, 除非要有那個美國時間,讓你搞到好的設計。
在專案頻繁的功能再追加,可以考慮用Extract and Override技巧。
public class Bill
{
Customer customer = new Customer();
public bool Pay()
{
return customer.Validation();
}
}
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public int Amt { get; set; }
public bool Validation()
{
if (string.IsNullOrEmpty(Name))
{
return false;
}
if (Amt <= 0)
{
return false;
}
return true;
}
}
第二步提取方法並複寫,先加入Validation,並改Pay調用Validation()
public class Bill
{
Customer customer = new Customer();
public bool Pay()
{
return Validation();
}
public virtual bool Validation()
{
return customer.Validation();
}
}
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public int Amt { get; set; }
public bool Validation()
{
if (string.IsNullOrEmpty(Name))
{
return false;
}
if (Amt <= 0)
{
return false;
}
return true;
}
}
第三步加入單元測試,開始加入付款成功與付款失敗的案例。
public class PayTests
{
[Test]
public void Pay_Success_ReturnTrue()
{
var subBill = new StubBill();
subBill.status = true;
Assert.IsTrue(subBill.Pay());
}
[Test]
public void Pay_Fail_ReturnFalse()
{
var subBill = new StubBill();
subBill.status = false;
Assert.IsFalse(subBill.Pay());
}
public class StubBill : Bill
{
public bool status = true;
protected override bool Validation()
{
return status;
}
}
}
比較好的方式,透過Interface,使用注入的方式和模擬框架的部分,來進行測試。
元哥的筆記