2010-03-15 60 views
5

有沒有辦法知道何時從運行測試方法調用代碼?如何在代碼中告訴我們是否從testmethod運行.net test

bool MyMethod() 
{ 
    if (/* are we running a test? */) 
    { 
     return true; // otherwise this will fail from the automated build script 
    } 
    else 
    { 
     // run the proper code 
    } 
} 

,並請饒了我「這是一個非常糟糕的主意」意見:)

+0

這取決於你的測試框架,請詳細說明。 – 2010-03-15 11:36:08

+3

這是一個非常糟糕的主意。一個非常糟糕的主意。一個非常糟糕的主意。 – Will 2010-03-15 11:54:08

回答

4

你認識到這一點可能是一個壞主意,但你可能不知道的替代品。 您應該看看mocking frameworks - 它們可以提供一種方法,在您的單元測試中在運行時將替代實現注入代碼中。這是一個慣例,允許代碼在測試和生產中表現不同。

對主要問題。

這取決於您使用的單元測試框架。我不知道NUnit中的特定功能(例如)報告您正在進行測試。其他框架(如MS Test)可能會提供這樣的結果。但是,自己做起來很容易。

如果您對源代碼有約束力,只需使用#define指令來有條件地定義您可以分支的某個變量。

如果你綁定到一個庫,我建議創建一個用於跟蹤您是否在單元測試或實際代碼自己的類,並設置了類在TestFixture setup method來表明你對運行測試。你也可以使用Environment.SetEnvironmentVariable作爲避免寫一個特殊類的方法。

1

好吧,我就不告訴你我的「這是一個非常糟糕的主意」的評論。

你可以給方法一個參數bool isTestMode

+0

如果通過一個長的調用鏈調用該方法會怎麼樣?通過調用鏈傳遞'isTestMode'參數似乎非常具有侵擾性。打破單一方法的封裝是一件壞事 - 在許多方面做得更差,更糟糕。 – LBushkin 2010-03-15 11:42:46

+0

@LBushkin:我完全同意,但是由於檢查某個方法是否從測試中被調用的概念首先是一個壞主意,我只是認爲這種方法可能會導致OP快速「修復」事件,儘管如此,它很醜。但檢查也是如此。正確的做法是@ H ?vard S建議的。 – 2010-03-15 11:47:24

+0

我明白。如果這是一種他需要在多種極端情況下使用的技術,OP真的應該使用模擬框架來研究。 – LBushkin 2010-03-15 11:48:45

1

您應該通過反射檢查調用方法的屬性!我不會提這是一個牀的想法,因爲你知道它,因爲我看到;)

1

在您的問題概述的方法是是一個非常糟糕的主意。

如果您希望方法在測試中的行爲與其他方法不同,則更清晰的方法是重構與該方法的接口,並在測試時注入不同的實現。

例如爲:

// Interface whose implementation changes under testing 
public interface IChangesUnderTest 
{ 
    void DoesSomething(); 
} 

// Inject this in production 
public class ProductionCode : IChangesUnderTest 
{ 
    void DoesSomething() { /* Does stuff */ } 
} 

// Inject this under test 
public class TestCode : IChangesUnderTest 
{ 
    void DoesSomething() { /* Does something else */ } 
} 
1

這是我的建議。

而不是檢查的背景下,只需添加在一些有條件的錯誤代碼:

#if DEBUG 

/* assume you are running in a test environment here */ 

#endif 

這幾乎是不壞。如果這不是你所需要的,你可以看看#define -ing「TEST」,因爲你可能希望你的測試代碼在正常調試時不能執行。

相關問題