2015-04-22 42 views
2

我有一個控制檯應用程序。在發佈環境中,此時它完美運行。在IDE調試環境中,我不希望控制檯窗口關閉,因此我添加了該函數,並在程序的最後調用它。我如何知道我的程序在單元測試環境下

[Conditional("DEBUG")] 
public static void DebugWaitAKey(string message = "Press any key") 
{ 
    Console.WriteLine(message); 
    Console.ReadKey(); 
} 

當我調試我的程序時,它對我很好。但是通過單元測試,在退出之前它仍然等待一個密鑰!

解決方法只是我的程序的單元測試發佈版本,或測試其他功能。但我確實希望能夠確定當前會話正在進行單元測試,並在該函數中使用該標誌。

回答

2

我相信this應該回答你的問題。我從那裏上了一堂課,並根據你的情況進行調整。

/// <summary> 
/// Detects if we are running inside a unit test. 
/// </summary> 
public static class UnitTestDetector 
{ 
    static UnitTestDetector() 
    { 
     string testAssemblyName = "Microsoft.VisualStudio.QualityTools.UnitTestFramework"; 
    UnitTestDetector.IsInUnitTest = AppDomain.CurrentDomain.GetAssemblies() 
     .Any(a => a.FullName.StartsWith(testAssemblyName)); 
    } 

    public static bool IsInUnitTest { get; private set; } 
} 

然後,我添加了一行到你的方法,如果它正在運行測試不會碰到Console.ReadKey();

[Conditional("DEBUG")] 
public static void DebugWaitAKey(string message = "Press any key") 
{ 
    Console.WriteLine(message); 
    if(!UnitTestDetector.IsInUnitTest) 
     Console.ReadKey(); 
} 

注意:這將被視爲黑客攻擊,並不被視爲最佳做法。

編輯: 我還在github上創建了一個示例項目來演示此代碼。 https://github.com/jeffweiler8770/UnitTest

+0

這工作。你甚至在github中包含bin&obj? :-) –

+0

我並沒有試圖做到這一點,而且我對將東西放在github上很新。 :-) – Jeff

1

而不是找程序是否在調試模式下進行編譯,你可以看看調試器是否連接:

if (Debugger.IsAttached) 
{ 
    Console.WriteLine(message); 
    Console.ReadKey(); 
} 

注意,如果你開始從Visual Studio,不按Ctrl F5這將只檢測-F5(即開始調試只)

+0

我的意思CTRL-F5。 – Richard

+0

[有條件的(「DEBUG」)]與您的調試器具有相同的目的。附加的 –

+0

不,它不會。條件屬性檢查程序是否以調試模式編譯(即DEBUG符號存在)。礦井檢查是否連接了調試器。 – Richard

1

最簡單的方法,如果你的測試從一個專門的單元測試項目運行:使用AppSettings的標誌......

我不會調查在模式對於這樣的目的,我將在專門的U上運行測試nitTest項目具有自己的配置。

如果您需要收集數據,也許您應該簡單地使用跟蹤(他們可以從.config文件中定製)...?

希望這有助於...

+0

這會增加配置工作。我的期望是100%自動化。 –

0

我使用了Jeff的UnitTestDetector的變體。我不想檢查單元測試組件,並想控制哪些單元測試會考慮與否。

所以我創建了一個簡單的類,IsInUnitTest默認爲false。 然後在我想要運行條件代碼的單元測試類中添加TestInitializer和TestCleanup,我相應地設置了bool。

然後在我的常規代碼中,我可以使用UnitTestDetector。IsInUnitTest

簡單UnitTestDetector類:

/// <summary> 
/// Detects if we are running inside a unit test. 
/// </summary> 
public static class UnitTestDetector 
{ 
    static private bool _isInUnitTest = false; 
    public static bool IsInUnitTest 
    { 
     get { return _isInUnitTest; } 
     set { _isInUnitTest = value; } 
    } 
} 

單元測試來測試這個東西:

[TestClass] 
public class UnitTestDetectorTest_WithoutIsInUnitTest 
{ 
    [TestMethod] 
    public void IsInUnitTest_WithoutUnitTestAttribute_False() 
    { 
     bool expected = false; 
     bool actual = UnitTestDetector.IsInUnitTest; 
     Assert.AreEqual(expected, actual); 
    } 
} 

[TestClass] 
public class UnitTestDetectorTest_WithIsInUnitTest 
{ 
    [TestInitialize()] 
    public void Initialize() 
    { 
     UnitTestDetector.IsInUnitTest = true; 
    } 

    [TestCleanup()] 
    public void Cleanup() 
    { 
     UnitTestDetector.IsInUnitTest = false; 
    } 

    [TestMethod] 
    public void IsInUnitTest_WithUnitTestAttribute_True() 
    { 
     bool expected = true; 
     bool actual = UnitTestDetector.IsInUnitTest; 
     Assert.AreEqual(expected, actual); 
    } 
} 

狀況的代碼:

if (UnitTestDetector.IsInUnitTest) 
      return "Hey I'm in the unit test :)"; 
相關問題