断言匿名类型是否相等

3
我遇到了一个问题,需要断言两个匿名类型是否相等。

目前我已经做了以下事情:

  • 我有一个单元测试项目,可以查看我的受测试项目的内部信息,因此匿名类型对测试项目可见。
  • 我已经在这里阅读了有关匿名类型更像结构体(值类型)而不是引用类型的行为: Why anonymous types Equals implementation compares fields?

然而,在尝试测试相等性时,以下断言异常仍然会发生:

1.

Assert.IsTrue(actionResult.Value.Equals(expectedActionResult.Value));

期望值:True 实际值:False

2.

Assert.AreEqual(actionResult.Value, expectedActionResult.Value);

期望结果: <{ errorCode = -4, errorMessage = 请求中参数无效或缺失。 }> (<>f__AnonymousType0'2[System.Int32,System.String]) 实际结果: <{ errorCode = -4, errorMessage = 请求中参数无效或缺失。 }> (<>f__AnonymousType0'2[System.Int32,System.String])

这里是我创建实际结果和期望结果的地方:

var actionResult = _systemUnderTest.GetToken(null) as JsonResult;
var expectedActionResult = 
    new JsonResult(new
    {
        errorCode = (int)ErrorCodes.InvalidOrMissingParameters, errorMessage = ErrorCodes.InvalidOrMissingParameters.GetDescription()
    });

我漏掉了什么?


1
你也可以看看这里提供的答案:https://dev59.com/b1oT5IYBdhLWcg3wjwF-#38446754 - Nkosi
1个回答

2

虽然匿名类型在您的测试项目中是可访问的,但这并不意味着当您编写new { ... }时它们将被使用。

如果您查看actionResult.Value.GetType()expectedActionResult.Value.GetType(),我强烈怀疑您会发现它们是来自不同程序集的不同类型。

在这种情况下最简单的解决方法可能只是比较生成的JSON。


actionResult.Value.GetType().Module.ScopeNameexpectedActionResult.Value.GetType().ScopeName 产生了不同的程序集,但除此之外,乍一看其他都一样,甚至包括奇怪的 UnderlyingSystemType,这是令人费解的,编译器是每次生成这些名称吗?这是否意味着匿名类型不能跨程序集进行测试? - kuskmen
1
如果它们在不同的程序集中,则其他一切都是完全无关紧要的 - 它们是不同的类型。匿名类型中的相等比较首先检查类型是否相同,这是常见的相等性检查。 - Jon Skeet
从我在调试编译器生成的代码时看到,我注意到从对象转换为特定编译器生成的匿名类型会失败,因此Equals方法返回false。[DebuggerHidden] public override bool Equals(object value) { var <>f__AnonymousType = value as <>f__AnonymousType0<<a>j__TPar>; return <>f__AnonymousType != null && EqualityComparer<<a>j__TPar>.Default.Equals(this.<a>i__Field, <>f__AnonymousType.<a>i__Field); } - kuskmen

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