【问题标题】:Asserting for equality anonymous types断言相等匿名类型
【发布时间】:2017-08-07 16:32:27
【问题描述】:

我遇到了断言两个匿名类型的问题。

到目前为止我做了什么

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

再一次,在尝试再次测试相等性时出现断言异常:

1.

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

预期:正确但结果:错误

2.

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

预期: (f__AnonymousType0'2[System.Int32,System.String]) 但是是: (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()
    });

我错过了什么?

【问题讨论】:

标签: c# .net unit-testing anonymous-types


【解决方案1】:

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

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

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

【讨论】:

  • actionResult.Value.GetType().Module.ScopeNameexpectedActionResult.Value.GetType().ScopeName 产生了它们不同的程序集,但除此之外,乍一看其他一切都一样,即使是奇怪的 UnderlyingSystemType 编译器也不会每次都生成这些名称这是否意味着无法跨程序集测试匿名类型?
  • @kuskmen:如果它们在不同的程序集中,那么其他一切都完全无关——它们是不同的类型。匿名类型中的相等比较首先检查类型是否相同,这在相等检查中很常见。
  • 根据我在调试编译器生成的代码时看到的情况,我注意到从对象转换为特定编译器生成的匿名类型失败,因此 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); }
猜你喜欢
  • 2022-05-01
  • 1970-01-01
  • 2022-07-23
  • 2019-03-04
  • 2021-12-04
  • 2013-04-30
  • 2019-05-19
  • 1970-01-01
  • 2017-08-04
相关资源
最近更新 更多