2010-02-18 47 views
4

我有一個類,它現在應該總是有一個特定的成員填充之前,它是有效的。爲了執行此操作,類沒有默認構造函數,而是有一個構造函數接受該必需成員的值。設置與此類似如下:在NUnit中測試不可編譯的代碼

public class MyClass 
{ 
    public string Owner { get; protected set; } 

    public MyClass(string owner) 
    { 
    this.Owner = owner; 
    } 
} 

現在我想編寫一個測試,以確保有其實沒有默認構造函數,因此,如果一個在未來被添加,提醒我們的沒有理由背後的原因,並被迫考慮這樣做的影響。儘管顯然試圖在測試中調用默認構造函數不會失敗,但它不會編譯。

有沒有一種很好的方法來完成這種測試而無需修改我的原始類?如果沒有,我想我可以實現一個引發異常的默認構造函數。我唯一猶豫的是現在調用默認構造函數變成可編譯代碼,然後我們必須依賴其他測試來確保這些代碼不會被寫入。

想法?

+1

無論你想出什麼解決方案,我都會建議記錄類中缺少默認構造函數的重要性,以便您不依賴於未來可能運行或未運行的測試。當然,下一個開發人員可能會忽略其他級別的評論:-) – 2010-02-18 19:53:52

+0

應該在構建服務器上運行測試,以便如果失敗,構建將會中斷。依靠開發人員來運行測試總是一個壞主意 - 如果沒有持續集成,單元​​測試將無法正常工作。 – womp 2010-02-18 20:26:27

+0

@womp:同意但運行在構建服務器上,或者不能單獨測試仍然可以啓用/禁用,這是我的觀點。依靠項目其他部分的測試將繼續進行下去並不無道理,但也不能保證。至少在課堂上的意見,你正在盡一切努力讓人們意識到。因爲未來的開發人員不會知道與特定測試存在相關的「原因」,所以可能比單獨測試更爲重要。我想,涵蓋所有基地是我的觀點。 – 2010-02-18 20:53:17

回答

10

您可以調用Activator.CreateInstance(typeof(MyClass))來嘗試運行默認構造函數,並聲明MissingMethodException被拋出。

[Test] 
[ExpectedException(typeof(MissingMethodException)) 
public void ShouldBeNoDefaultConstructorForMyClass() 
{ 
    Activator.CreateInstance(typeof(MyClass)); 
} 
+0

-1,爲什麼調用它時,你可以簡單地斷言它不在那裏? – 2013-03-09 10:58:59

+0

+1 - 正是我所需要的。要回答約翰,你可以這樣做。既然人們可以選擇一種或另一種,並且兩種都回答問題,那麼爲什麼你只需要一個有效的答案,因爲它不是你選擇的路徑呢? – Dracorat 2014-05-07 23:46:50

0

,你可以使用反射來檢查是否有該類的無參數的構造函數,如果有

9

我想創建一個默認的構造函數測試失敗,其標記爲私有,並把你的文檔存在。那麼你做這件事的原因不會隱藏在某個地方。你必須意識到你會放棄一些需要無參數構造函數的序列化功能。

+0

在這種情況下,我比單元測試概念更喜歡這種方式,因爲單元測試通常會落在路邊,而當您嘗試更改它時,帶有註釋的代碼在您的臉上也是正確的。畢竟,在這種情況下,你並沒有試圖測試功能,而是編程風格或編程規範,這並不是真正的單元測試。 – Nick 2010-02-18 19:50:35

+1

我更喜歡兩者的組合。我總是假設測試應該記錄商業原因。關於測試的好處是,它通過打破構建強制遵守。文檔沒有。 – womp 2010-02-18 20:27:40

5
ConstructorInfo ci = typeof(MyClass).GetConstructor(Type.EmptyTypes); 
Assert.IsNull(ci); 
0

沒錯。一個好的方法是使用反射來嘗試try/catch中的無參數構造函數。

相關問題