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

发布于 2024-08-04 15:56:14 字数 736 浏览 3 评论 0原文

在我的应用程序中,我有两个等效的枚举。一个位于 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,但我认为这适用于任何单元测试框架)

In my application, I have two equivalent enums. One lives in the DAL, the other in the service contract layer. They have the same name (but are in different namespaces), and should have the same members and values.

I'd like to write a unit test that enforces this. So far, I've got the following:

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?
    }
}

This works fine for comparing the names, but how do I check that the values match as well?

(I'm using NUnit 2.4.6, but I figure this applies to any unit test framework)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

忆依然 2024-08-11 15:56: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));
}

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));
}
樱娆 2024-08-11 15:56:14

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

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

I would flip the way you check around. It is easier to get a name from a value instead of a value from a name. Iterate over the values and check the names at the same time.

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 ) );
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文