【问题标题】:Has dynamic changed in .net core 3.0? [duplicate].net core 3.0 中的动态变化了吗? [复制]
【发布时间】:2020-04-03 18:33:51
【问题描述】:

我正在编写一个单元测试来测试调用控制器方法的结果。我知道它会在参数错误的情况下返回一个带有单个属性“错误”的匿名对象。

[Test]
public async Task should_inform_about_invalid_param()
{
    var res = await Controller.Index("Donkey");
    Assert.That(res, Is.Typeof<BadRequestObjectResult>());
    var obj = (res as BadRequestObjectResult).Value;
    dynamic dyn = obj; 
    string errorText = dyn.error;
    Assert.That(errorText, Contains.Substring("Donkey"));
}

实际测试无关紧要。但是,我希望这能够奏效并能够得到结果。相反,我得到以下异常

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:“对象”不包含“错误”的定义

现在我可以使用反射来提取错误,但是它既丑陋又麻烦。

var errorText = obj.GetType().GetProperty("error").GetValue(obj) as string

这有改变吗?我觉得过去我总是可以使用dynamic 来提取动态对象的值。

编辑: 附上截图。

【问题讨论】:

  • 错误信息正确:object 不包含error 属性或方法。
  • 您是否有任何理由使用两个步骤从您的BadRequestObjectResult 中提取Value 而不是一个? dynamic dyn = (res as BadRequestObjectResult).Value;
  • 没有真正的原因,只是测试的编写方式。也许它使调试更容易。是的,对象确实包含错误,但动态应该能够发现对象中存储的匿名对象上存在error 属性。
  • 一步到位试试。
  • 很遗憾,这行不通

标签: c# dynamic


【解决方案1】:

显然,该问题与匿名类型在声明程序集内部这一事实有关。

一种解决方案是使用[assembly:InternalsVisibleTo(UnitTestLibraryName)] 标记托管程序集 这样做允许动态访问匿名类型的成员。

【讨论】:

    猜你喜欢
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多