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

7

在我的应用程序中,我有两个等效的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个回答

17

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));
}

啊,我尝试使用Assert.AreEqual((int)xValues[i], (int)yValues[i]),但它并不起作用。 - Roger Lipscombe

2

我会更改您检查的方式。从值中获取名称比从名称中获取值更容易。同时遍历值并检查名称。

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 ) );
        }
    }
}

假设您正在测试两个不同的枚举类型的整数等价性和字符串等价性,那么您需要进行转换:Assert.AreEqual(xValue,yValue);可能应该是Assert.AreEqual((int)xValue,(int)yValue); 在这种情况下,这比所选答案更彻底。 - andes
1
这个答案是正确的,但你还需要作为第二步切换x,y,以便你可以双向检查它。否则,你可能会在y类型中有额外的内容,而在x类型中没有。 - Jerico Sandhorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接