我们今天在代码中遇到了一个错误。我们有一些列表,其中数据的键是枚举类型。有多个不同的枚举类型被用作键(如下面代码中的Foo.Bar1和Foo.Bar2)。
所有测试都有一个DataFields列表,其中包含1个项目,其键设置为其中一个枚举值。第一个和最后一个测试按预期运行。第二个测试预计会成功,但失败了。阅读代码时,它似乎是合法的。
我的假设是通过取消装箱变量,枚举值被转换为它们的整数值,并进行比较。这使它们相等,从而返回true,使Any()方法也返回true。这是正确的吗?还是其他事情正在发生?
我们应该像第三个测试那样编写比较,使用equals()方法...
如果在单元测试中重新创建了一个非常简化的问题版本。
所有测试都有一个DataFields列表,其中包含1个项目,其键设置为其中一个枚举值。第一个和最后一个测试按预期运行。第二个测试预计会成功,但失败了。阅读代码时,它似乎是合法的。
我的假设是通过取消装箱变量,枚举值被转换为它们的整数值,并进行比较。这使它们相等,从而返回true,使Any()方法也返回true。这是正确的吗?还是其他事情正在发生?
我们应该像第三个测试那样编写比较,使用equals()方法...
如果在单元测试中重新创建了一个非常简化的问题版本。
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using System.Linq;
namespace EnumCastTest
{
[TestClass]
public class UnitTest1
{
public class DataField
{
public Enum Key { get; set; }
}
class Foo
{
public enum Bar1 { A }
public enum Bar2 { B }
}
[TestMethod]
public void Field_With_Bar1_A_Should_Return_True()
{
List<DataField> fields = new List<DataField> {
new DataField() { Key = Foo.Bar1.A} };
Assert.IsTrue(fields.Any(q => (Foo.Bar1)q.Key == Foo.Bar1.A));
}
[TestMethod]
public void Field_Without_Bar1_A_Should_Return_False()
{
List<DataField> fields = new List<DataField> {
new DataField() { Key = Foo.Bar2.B} };
Assert.IsFalse(fields.Any(q => (Foo.Bar1)q.Key == Foo.Bar1.A));
}
[TestMethod]
public void Field_Without_Bar1_A_Should_Return_False2()
{
List<DataField> fields = new List<DataField> {
new DataField() { Key = Foo.Bar2.B} };
Assert.IsFalse(fields.Any(q => Foo.Bar1.A.Equals(q.Key)));
}
}
}
List.Any
与此无关。 - Tim Schmelter