c# - MVC SelectListItem 不实现等于吗?

标签 c# asp.net-mvc-3 unit-testing equality

忙于为 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() )......无论如何。 .. 除了这样做,您还可以:

  1. 在您的测试项目中创建一个辅助方法来进行值比较(可以使用适用于大多数简单类的反射编写通用方法),或者
  2. 制作一个辅助类来实现IEqualityComparer<T>对于您需要比较的每种类型。

两者都不允许您使用 Assert.AreEqual() ,但总的来说,我不赞成将代码添加到您的对象中只是为了允许测试 - 更喜欢将其保留在测试项目中。另外,使用这些方法,您将“不需要”实现 GetHashCode()

关于c# - MVC SelectListItem 不实现等于吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9122241/

相关文章:

c# - 在 XNA 中钳制 TextureAddressMode

c# - 来自 dbml 的 UpdateOnSubmit?

c# - 在 C# 中如何跨列?

asp.net-mvc-3 - MVC 3客户端验证,模型绑定(bind)十进制值和文化(不同的小数分隔符)

python - Python套件,软件包,模块,TestCase和TestSuite的差异

python - 尝试导入测试床时出错

java - BDD 方式的 JUnit 测试应该如何集中

c# - WinRT 和持久化结构与字节数组?

asp.net-mvc - 从 ModelMetaData 获取另一个属性的值

asp.net-mvc - MVC 3布局页面,Razor模板和DropdownList