2017-02-15 44 views
0

所以這是一個奇怪的設置。我將我們的測試從MSTest(Visual Studio單元測試)轉移到NUnit 3+。Catch NUnit AssertionException在C#中沒有失敗測試#

在我最初的測試框架中,我添加了一個名爲Verify的測試實用程序,其中創建了斷言,但異常被抑制/忽略,我們只是等到測試結束時斷言是否發生任何故障。

public class Verify { 
    public static int NumExceptions = 0; 

    public static void AreEqual(int expected, int actual) { 
     try { 
      Assert.AreEqual(expected, actual); 
     } catch (AssertFailedException) { 
      NumExceptions++; 
     } 
    } 

    public static void AssertNoFailures() { 
     Assert.AreEqual(0, _numExceptions); 
    } 
} 

因此,對於這個測試代碼可能是:

[TestMethod] 
public void VerifyPassesCorrectly() { 
    int x = 2; 
    int y = 3; 

    Verify.AreEqual(3, y); 
    Verify.AreEqual(2, x); 
    Verify.AreEqual(5, x + y); 

    Verify.AssertNoFailures(); 
} 

[TestMethod] 
[ExpectedException(typeof(AssertFailedException))] 
public void VerifyCountsFailuresCorrectly() { 
    Verify.AreEqual(3, 2); 
    Assert.AreEqual(1, Verify.NumExceptions); 
} 

這兩種測試都通過了,即使一個AssertFailedException被拋出

當我移動到NUnit的,好像有更好如何去做這件事(警告,MultipleAssert)。最終,我們將構建新的測試以利用這些改進。但是,在此期間,我需要爲現有測試提供一些向後兼容性。

我原來的計劃是簡單地換出庫,改變異常類型:

public static void AreEqual(int expected, int actual) { 
    try { 
     Assert.AreEqual(expected, actual); 
    } catch (AssertionException) { 
     NumExceptions++; 
    } 
} 

這需要對現有的測試代碼沒有實質性的變化,也沒有真正的驗證類的結構。但是,當我使用NUnit Adapter在Visual Studio中執行這樣的測試時,第二個測試按預期運行(不例外),但仍未通過測試,列出了在驗證步驟中發現的異常。

更廣泛的解決方案是簡單地移除Verify類,因爲NUnit不再需要它。但在這種情況發生之前,有沒有辦法在Verify中使用NUnit API,以便Verify類中的斷言不會被NUnit「存儲」並用於失敗測試?

回答

2

您將無法告訴NUnit,斷言應該以某種方式不會使測試失敗。所以,你可以做的是改變你的AreEqual方法,只是做自己平等測試。

if (expected != actual) { 
    NumExceptions++; 
} 

這似乎是最簡單的解決方案。

第二種選擇是完全按照NUnit的Assert語句進行操作。如果你想做(但不會導致測試失敗當然)。該代碼是這樣的:

public static void AreEqual(int expected, int actual) { 
    var equalToConstraint = Is.EqualTo(expected); 
    var result = equalToConstraint.ApplyTo(actual); 
    if (!result.IsSuccess) { 
     NumExceptions++; 
    } 
} 

Is類是NUnit的的一部分,但它是公共的,如果你願意,你可以使用它像這樣。

+0

好的,在我經歷這個過程時,確實發生了這種情況。我希望可能有一個「更好」的方式來做到這一點。謝謝! –