在MVC控制器上进行单元测试,HttpStatusCode不相等。

3
我正在对一个简单的控制器进行单元测试,检查当传入一个空ID时,它是否返回400代码。然而,当我测试时,结果并不等于400错误代码。
我的代码:
int? nullID = null;
var edit = controller.Edit(nullID) as ActionResult;

var result = new HttpStatusCodeResult(400, null);

Assert.AreEqual(edit, result);

当我调试测试时,我得到了预期的结果,如下所示:
编辑结果:

Edit Result

期望结果:

Expected Result

我在这里做错了什么?


我不明白你的意思,你的编辑类型是“HttpStatusCodeResult”,状态码为400,没有描述,就像你在测试中指定的结果一样。有什么问题没有按照预期工作吗?还是你的断言失败了?如果是这种情况,我会说“HttpStatusCodeResult”的“.Equals”实现并没有做你期望它做的事情。 - Edo Post
当我在测试中断言edit和result相等时,测试失败了,我不明白为什么。 - haddow64
2个回答

4

Assert.AreEqual(a,b) 等同于 Assert.IsTrue(Object.Equals(a,b))

HttpStatusCodeResult 没有实现 Equals 方法,所以调用默认的 Object.Equals() 方法,该方法又默认调用了 Object.ReferenceEquals(a,b) 方法。

如果当前实例是引用类型,则 Equals(Object) 方法会测试引用相等性。调用 Equals(Object) 方法等同于调用 ReferenceEquals 方法。引用相等性意味着被比较的对象变量引用同一个对象。


3

我认为HttpStatusCode类的equals方法是根据引用键来比较的,我测试了您的设置,我的断言也失败了。不过,直接断言状态码本身是可以正常工作的。例如:

[TestMethod]
public void Test()
{

  var resultOne = new HttpStatusCodeResult(400, null);
  var resultTwo = new HttpStatusCodeResult(400, null);

  // Assert
  Assert.AreEqual(resultOne.StatusCode, resultTwo.StatusCode);

  Assert.AreEqual(resultOne, resultTwo);
}
Assert.AreEqual(resultOne.StatusCode, resultTwo.StatusCode); 对比成功,而Assert.AreEqual(resultOne, resultTwo);对比失败。 更新 请查看MSDN页面了解HttpStatusCodeResult的详细信息。在该页面中,您可以看到其等于实现是从Object继承的,因此不会涉及对象中的属性,而只会查看引用键。

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