1
Vote

AssertEx.cs 之 AreEqual 日期容許誤差比較不必檢查 NULL 值

description

在 TestAutomation\Verify\AssertEx.cs 之

public static void AreEqual(DateTime expected, DateTime actual, TimeSpan tolerance, string context)
 
中,有呼叫 VerifyNullParity(expected, actual, message);。

由於 DateTime 是 struct,不可能有 NULL 值,也因此不需要呼叫 VerifyNullParity(expected, actual, message); 作 NULL 值檢查。

comments

yjchiou wrote Oct 28, 2008 at 2:45 AM

以下為我的猜測:
在 AssertExTest.cs 中的 VerifyNullParityTest3() 中有明確做了 NULL 值的測試,故若沒有做檢查,這個單元測試即不會通過。
    [TestMethod()]
    public void VerifyNullParityTest3()
    {
        object expected = null;
        object actual = null;
        string context = "";

        AssertEx.VerifyNullParity(expected, actual, context);
    }
Hope this helps.
Jacky
http://blogs.msdn.com/jchiou

ChrisTorng wrote Nov 7, 2008 at 3:12 AM

VerifyNullParityTest3() 只針對 AssertEx.VerifyNullParity() 測試,我並沒有說要刪掉 AssertEx.VerifyNullParity() 這個函式,因此這個測試並不會失敗。我的意思只有將 AssertEx.AreEqual() 內呼叫 VerifyNullParity() 該行拿掉而已。

為了測試傳 NULL 的 DateTime 值,直接寫 DateTime g = NULL; 會導致編譯不過,會說「無法將 null 轉換成 'System.DateTime',因為它是不可為 null 的實值型別」。如果增加一個測試如下:

[TestMethod()]
[ExpectedException(typeof(AssertFailedException))]
public void VerifyDateTimesTolerance2()
{
object g = null;
DateTime g2 = DateTime.Now;
TimeSpan tolerance = TimeSpan.FromMilliseconds(100);
AssertEx.AreEqual((DateTime)g, g2, tolerance, "");
}

我希望能觸發 VerifyNullParity() 中的 Assert.Fail() 而丟出 AssertFailedException 例外。執行測試的結果卻為:

測試方法 MIC.TestAutomation.UnitTests.AssertExTest.VerifyDateTimesTolerance2 擲回例外狀況 System.NullReferenceException,但是預期的例外狀況為 Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException。例外狀況訊息: System.NullReferenceException: 並未將物件參考設定為物件的執行個體

根本還沒有呼叫 AssertEx.AreEqual(),呼叫端參數的轉型就失敗了。因此這個測試根本還沒有測到待測程式。也因此,AssertEx.AreEqual() 絕對沒有呼叫 VerifyNullParity() 的任何合理理由存在。

wrote Feb 1, 2013 at 11:44 PM