類似的話題已經在The value of high level unit tests and mock objects單元測試是在高的抽象層次
但是討論的方法,我想描述一個具體情況,問你對我應該怎麼寫單元測試的意見。
我正在開發一個普通的3層應用程序,它使用實體框架。上述EF,我有兩個層次:
- 庫:他們直接訪問EF ObjectContext的和做所有的CRUD工作(實際上,這些類與T4模板生成)。所有Repository類都有一個適當的接口。
- 經理:他們實現更高級別的業務邏輯,他們不直接訪問ObjectContext,而是使用合適的Repository。管理員不知道具體的Repository-implementation,只有界面(我使用依賴注入,並在單元測試中模擬)。
沒有進一步的說明,這裏是我想編寫單元測試的類:
public class PersonManager
{
private IPersonRepository personRepository; // This is injected.
// Constructor for injection is here.
public void ComplexMethod()
{
// High level business logic
bool result = this.SimpleMethod1();
if(result)
this.SimpleMethod2(1);
else
this.SimpleMethod2(2);
}
public bool SimpleMethod1()
{
// Doing some low-level work with the repository.
}
public void SimpleMethod2(int param)
{
// Doing some low-level work with the repository.
}
}
它是用的一個模擬實例化PersonManager
很容易單元測試SimpleMethod1
和SimpleMethod2
PersonRepository
。
但我找不到任何方便的方法來單元測試ComplexMethod
。
你有什麼建議我應該怎麼做?或者不應該單元測試?也許我不應該使用this
參考ComplexMethod
中的方法調用,而是通過一個接口訪問PersonManager
本身,並用一個模擬代替它。
在此先感謝您的任何建議。
爲什麼你不能測試ComplexMethod?你可能不需要爲SimpleMethod 1&2測試設置額外的期望... –