2013-11-04 254 views
2

做TDD並希望隔離被測方法:Direct(); 然而,當測試創建MyClass,SomeClass.SetupStuff();炸掉(NotImplementedException)。因此,將IMyClass接口修改爲具有Configure();方法,可以在MyClass構造之後調用該方法以避免該異常。c#構造函數與初始化

問題:這是處理這種情況的一種可接受的方式,或者是否存在一些基本的OOP主體?

public class MyClass : IMyClass 
{ 
    public MyClass() 
    { 
    // class with static method that sets stuff up 
    SomeClass.SetupStuff(); 
    } 
    public void IMyClass.Direct() 
    { 
    // want to test this 
    } 
} 

VS

避免此類問題
public class MyClass : IMyClass 
{ 
    public MyClass() 
    { 

    } 
    public void IMyClass.Direct() 
    { 
    // want to test this 
    } 
    // 
    public void IMyClass.Configure() 
    { 
    // class with static method that sets stuff up 
    SomeClass.SetupStuff(); 
    } 
} 
+0

在實例方法中設置靜態數據對我來說似乎很奇怪。 – Tilak

+0

這有點令人困惑。如果你正在做TDD,那麼這意味着你的測試*應該失敗*直到你實現需要實現的東西。如果你還沒有實現'SomeClass.SetupStuff',那麼你需要實現它才能通過測試。我想我只是不明白這裏的問題。將代碼移回'.ctor'並實現該方法。繁榮,測試通過。 –

+0

爲什麼不通過構造函數注入SomeClass。不要讓它變成靜態的。而不僅僅是爲了你的測試而嘲笑它。你的課目前依賴於SomeClass。你想測試Direct()而不是SomeClass – Sean

回答

5

一種方法是使用依賴注入

public class MyClass : IMyClass 
{ 
    public MyClass(ISomeClass someClass) 
    { 
     someClass.SetupStuff(); 
    } 

    public void IMyClass.Direct() 
    { 
     // want to test this 
    } 
} 

通過從SomeClass的脫鉤類,你可以自由地提供一個模擬實現ISomeClass的在測試期間可以在運行時提供完整的實現。