比较两个枚举*类型*是否等价?

时间:2009-09-11 10:15:48

标签: c# unit-testing enums

在我的应用程序中,我有两个等效的enum。一个住在DAL,另一个住在服务合同层。它们具有相同的名称(但位于不同的名称空间中),并且应具有相同的成员和值。

我想写一个强制执行此操作的单元测试。到目前为止,我有以下内容:

public static class EnumAssert
{
    public static void AreEquivalent(Type x, Type y)
    {
        // Enum.GetNames and Enum.GetValues return arrays sorted by value.
        string[] xNames = Enum.GetNames(x);
        string[] yNames = Enum.GetNames(y);

        Assert.AreEqual(xNames.Length, yNames.Length);
        for (int i = 0; i < xNames.Length; i++)
        {
            Assert.AreEqual(xNames[i], yNames[i]);
        }

        // TODO: How to validate that the values match?
    }
}

这适用于比较名称,但如何检查值是否匹配?

(我正在使用NUnit 2.4.6,但我认为这适用于任何单元测试框架)

2 个答案:

答案 0 :(得分:14)

Enum.GetValues

var xValues = Enum.GetValues(x);
var yValues = Enum.GetValues(y);

for (int i = 0; i < xValues.Length; i++)
{
    Assert.AreEqual((int)xValues.GetValue(i), (int)yValues.GetValue(i));
}

答案 1 :(得分:1)

我会翻转你检查的方式。从值中获取名称而不是名称中的值更容易。迭代值并同时检查名称。

public static class EnumAssert
{
    public static void AreEquivalent(Type x, Type y)
    {
        // Enum.GetNames and Enum.GetValues return arrays sorted by value.
        var xValues = Enum.GetValues(x);
        var yValues = Enum.GetValues(y);

        Assert.AreEqual(xValues.Length, yValues.Length);
        for (int i = 0; i < xValues.Length; i++)
        {
            var xValue = xValues.GetValue( i );
            var yValue = yValues.GetValue( i );
            Assert.AreEqual(xValue, yValue);
            Assert.AreEqual( Enum.GetName( x, xValue ), Enum.GetName( y, yValue ) );
        }
    }
}