2010-06-14 174 views
3

有什麼辦法有測試調用構造函數的代碼時,而不是構建的真實情況的模擬?構建嘲笑

例如:

public class ClassToTest 
{ 
    public void MethodToTest() 
    { 
    MyObject foo = new MyObject(); 
    Console.WriteLine(foo.ToString()); 
    } 
} 

在本例中,我需要創建一個單元測試,證實了對ClassToTest的實例調用MethodToTest確實會輸出任何新的的ToString()方法的結果創建MyObject的實例。

我看不到的孤立現實測試「ClassToTest」類的方式;測試這個方法實際上會測試'myObject.ToString()'方法以及MethodToTest方法。

回答

3

不是真的。由於其設計,您的ClassToTest難以測試。如果您希望能夠替換模擬對象的依賴關係,那麼您需要考慮如何注入這些依賴關係 - 但只是在構造函數中創建它們不是一種可以幫助您的方法。您可以使用構造器注入:

public class ClassToTest 
{ 
    MyObject _foo; 
    public void MethodToTest(Myobject foo) 
    { 
    _foo = foo; 
    Console.WriteLine(foo.ToString()); 
    } 
} 

或者你可以使用屬性注:

public class ClassToTest 
{ 
    public MyObject Foo { get; set; } 
    public void MethodToTest() 
    { 
    } 
} 

前者可能更適合給你想在那裏寫出來控制檯的例子;當你的依賴關係必須具有對象的依賴關係而不是可選屬性時,它通常是最好的方法。

你可以做得比探索dependency injectioninversion of control概念差很多。

+0

有一個類似的問題,使用上控制檯靜態方法WriteLine。這將很難測試。就我個人而言,我將BCL類(如Console)包裝到一個類中,該類中包含一個實例方法WriteLine,它代表您調用真正的控制檯。然後在測試中,你注入一個模擬包裝並聲明反對。 – 2010-06-14 12:30:24

+0

我認爲,在某些情況下,無論測試如何,這肯定是一個更好的選擇,但我主要關心的是,在某些情況下,允許客戶端代碼提供'ClassToTest'使用的對象可能不是一個好主意」。此外,在某些情況下,如果只有ClassToTest包含構建它所需的數據,則客戶端代碼可能無法提供合適的實例。 我曾希望有可能爲「超越」 .NET的類註冊,並提供自己的一類,即,在這種情況下,一個模擬。 – Flynn1179 2010-06-14 12:35:59