2012-12-28 57 views
7

每當我想鍛鍊的,否則只能在一個艱難的達成代碼的某一路徑重現condition,如:測試難以觸及的代碼路徑

if (condition) { code to be tested } 

我有trueor它:

if (true || condition) { code to be tested } 

有沒有更優雅的方法?

+0

您是否試圖通過調試器運行代碼?我會建議尋找'單元測試'這一點。模擬解決方案可能有助於使您的代碼可測試。通過將它作爲一個單元測試寫出來,您現在不僅可以測試您的代碼,還可以繼續測試! –

回答

13

我想更多elegant way作爲原料,the logical negation operator (!);

if (!condition) { code to be tested } 

但更安全的方式進行調試和測試目的您可以使用預處理指令(按我commet)。完成測試後簡單地刪除或更改#define UnreachableTest

#define UnreachableTest //should be on the top of the class/page 

#if (UnreachableTest) 
    condition = !condition; //or 
    condition = true; 
#endif 

if (condition) { code to be tested } 
+0

是的,它在我看來更多優雅。只有在滿足條件時纔會發揮作用。但我喜歡它,我想在大多數使用情況下它會很好。 –

+5

在這種情況下,您可以使用「預處理器指令」在調試期間更改條件以進行測試。如; '#define UnreachableTest' on top ...'#if(UnreachableTest)condition =!condition#endif'然後你的實際代碼如下。 – Kaf

+5

對不起,我必須給這個答案-1。這是一個非常糟糕的代碼味道,以改變測試的邏輯條件。這很危險,因爲它可能導致有人忘記刪除「!」並最終生成代碼,使條件翻轉併產生錯誤/錯誤。 –

13

更優雅的解決方案是使用mocks。使基於相關性或參數決定:

var mock = new Mock<IFoo>(); 
mock.Setup(foo => foo.IsBar).Returns(true); 
var sut = new Sut(mock.Object); 
sut.DoSomething(); 

而在你的系統下測試:

public void DoSomething() 
{ 
    if (_foo.IsBar) 
     // code path to test 
} 
+1

在發佈之前閱讀問題 - 「想要實現一定的代碼路徑,否則只能在難以重現的情況下才能達到目的」OP的目標是測試if中的代碼,即100%的機會去那裏的代碼 – Nogard

+4

@Nogard我提到了模擬的使用。並添加了代碼示例。在評論之前閱讀答案。 –

+1

當然,我看到了,但是你預先編輯的答案(我評論)只說'難以複製情況' - 嘲笑以及可以使用它。然後添加模擬樣本,它解決了OP問題。 – Nogard

2

我會認爲這不是一個單元測試場景,因爲它沒有在問題中提到。到目前爲止,對這樣的代碼進行即時測試最簡單的方法是使用調試器的Set Next Statement命令。

如果需要,在if語句中設置一個斷點,或者直到它到達該語句爲止。然後右鍵單擊if()語句正文中的下一行,然後選擇「設置下一個語句」。代碼將繼續在該行執行,完全跳過if()。

+0

好的+1。我一定會使用它。但在這種特定的情況下,我想至少運行幾次這種方式很尷尬。 –

3

你的方法用「true or」和if(!condition)的方法是最簡單的。這是我喜歡的一個大型程序的方法

創建一個函數,我們稱之爲testme(常量字符串)。而不是在if test中插入true,則插入testme,並使用一些標識該代碼段的字符串。

if (testme("Location 123") || condition) { code to be tested } 

然後,使用某種配置文件的,或者爭論你的程序(我比較喜歡的配置),你完全可以控制何時TESTME(「位置123」)將返回true。你可以在很多地方使用相同的功能。只需更改配置文件來測試每一個。

+0

+1。爲了這個目的,我一直在使用一個定義在其他地方的布爾變量。 –

2

將代碼在單獨的方法中進行測試。然後你可以調用方法並繞過條件。現在,您不必擔心添加「真實」或者更重要的是忘記刪除它。

您也可以爲該方法添加單元測試,以便您可以修改傳遞給它的參數並測試所需的所有場景。