9

假設我Foo類有以下幾點:單元測試構造器注入

readonly IService service; 

public Foo(IService service) 
{ 
    if (service == null) 
     throw new ArgumentNullException("service"); 

    this.service = service; 
} 

public void Start() 
{ 
    service.DoStuff(); 
} 

到目前爲止,我有,我傳入null來驗證一個ArgumentNullException被拋出構造一個單元測試。我是否需要對我的構造函數進行第二次單元測試,並在其中傳遞有效的IService並確認this.service已設置(這需要公共訪問器)?

或者我應該僅僅依靠我的單元測試Start方法來測試此代碼路徑?

回答

12

設置this.service是一個實現細節,所以您應該測試它是否在預期的地方使用,並且只需通過Start方法進行測試即可。免得你的測試變得脆弱。

你只想測試你的服務是否被恰當地使用。你不應該在乎它是如何存儲的。

9

這些測試是多餘的,因爲當您的構造函數不起作用時,沒有其他測試會成功。

說實話,我甚至懶得在我的構造函數中寫這些空檢查。原因很簡單:DI容器不允許使用空引用自動連接構造函數(或者至少不是默認的),所以不可能使用空值構造類型(當容器自動連接時) 。所以它只是添加無用的代碼,當我想要獲得高代碼覆蓋率時,這會使我添加無用的測試。

我說完全跳過這些空檢查並相信你的DI容器(或者選擇一個你可以信任的DI容器)。

+0

你可以做的其他事情是完全移除ctor,並讓它由T4模板生成,比如這個項目所做的:https://t4ctorgenerator.codeplex.com/。沒有必要單元測試生成的代碼。 – Steven