忙于为 Controller 编写单元测试,该 Controller 生成一个 View 模型,其中包含一个选项列表,如 IEnumerable < SelectListItem >。我尝试检查预期列表是否包含 View 模型中的所有列表,反之亦然。令我惊讶的是,这总是错误的。所以我创建了以下测试:
[TestMethod]
public void CanEqual()
{
var x = new SelectListItem {Selected = false, Text = "A", Value = "A"};
var y = new SelectListItem { Selected = false, Text = "A", Value = "A" };
Assert.AreEqual(x, y);
}
断言总是失败,但两者是相等的。 SelectListItem 真的没有实现 Equals 还是我只是在这里遗漏了什么?
最佳答案
添加到 Shark 的回答中...至于如何处理它,除了实现 IEquatable<T>
在派生类上(如果你这样做,你真的应该也覆盖非泛型 Equals()
- 如果你这样做那个,你真的应该覆盖 GetHashCode()
)......无论如何。 .. 除了这样做,您还可以:
- 在您的测试项目中创建一个辅助方法来进行值比较(可以使用适用于大多数简单类的反射编写通用方法),或者
- 制作一个辅助类来实现
IEqualityComparer<T>
对于您需要比较的每种类型。
两者都不允许您使用 Assert.AreEqual()
,但总的来说,我不赞成将代码添加到您的对象中只是为了允许测试 - 更喜欢将其保留在测试项目中。另外,使用这些方法,您将“不需要”实现 GetHashCode()
等
关于c# - MVC SelectListItem 不实现等于吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9122241/