簡體   English   中英

比較兩個對象以進行單元測試的擴展方法

[英]Extension method to compare two objects for unit testing

我想寫一個擴展方法來比較兩個對象的某些屬性。 我寫了這段代碼:

public static void AreTwoObjectsEqual(this Assert asr, object Actual, object Expected, List<string> FieldsMustCheck)
    {
        foreach (string item in FieldsMustCheck)
        {
            if (Actual.GetType().GetProperty(item) == null || Expected.GetType().GetProperty(item) ==  null)
            {
                throw new Exception("Property with name : " + item + " not found in objects ");
            }

            var ActualPropertyValue = Actual.GetType().GetProperty(item).GetValue(Actual, null);
            var ExpectedPropertyValue = Expected.GetType().GetProperty(item).GetValue(Expected, null);

            if (ActualPropertyValue != ExpectedPropertyValue)
            {
                throw new AssertFailedException("Test failed for propery : " + item);
            }
        }
    }

當我要構建項目時,出現此錯誤:

'Microsoft.VisualStudio.TestTools.UnitTesting.Assert':靜態類型不能用作參數

誰能幫助我消除此錯誤。

好吧,編譯器錯誤消息很清楚: Assert是一個靜態類,因此您不能將其用作擴展方法的參數類型。 老實說,目前尚不清楚為什么要這么做。 如果您希望能夠使用Assert.AreTwoObjectsEqual ,那么您就不能這樣做-擴展方法旨在模擬實例方法,而不是其他類型的靜態方法。

我懷疑您應該只創建自己的靜態類,例如MoreAssert ,並使其成為普通的靜態方法:

public static class MoreAssert
{
    public static void AreEqualByProperties(object expected, object actual,
        List<string> propertyNames)
    {
        ...
    }
}

參數名稱已更改為符合.NET命名約定。 我強烈建議您也將camelCase名稱用於局部變量。 我還對參數進行了重新排序,使其與其他斷言一致。

因此,您只需致電:

MoreAssert.AreEqualByProperties(...);

您也可以考慮使用params string[] propertyNames代替List<string> propertyNames來簡化調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM