我正在编写一个单元测试,以测试调用控制器方法的结果。我知道一个事实,如果参数错误,它将返回带有单个属性“错误”的匿名对象。
[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
来提取动态对象的值。
答案 0 :(得分:0)
显然,此问题与以下事实有关:匿名类型在声明程序集内部。
一种解决方案是用[assembly:InternalsVisibleTo(UnitTestLibraryName)]
标记托管程序集
这样做可以动态访问匿名类型的成员。