【发布时间】: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属性。 -
一步到位试试。
-
很遗憾,这行不通