当前位置: 首页 > 编程语言 > C#

如何对返回匿名对象的ASP.NETCoreMVC控制器进行单元测试?

时间:2023-04-11 03:33:54 C#

如何对返回匿名对象的ASP.NETCoreMVC控制器进行单元测试?我在对返回匿名对象的ASP.NETCoreMVC控制器进行单元测试时遇到问题。单元测试在单独的项目中设置,并直接从主项目调用控制器方法。控制器方法返回IActionResult但通常这些是OkObjectResult和BadRequestObjectResult对象,它们被转换为具有适当HTTP状态代码的JSON响应。一个匿名对象作为我试图断言的ObjectResult对象的构造函数参数传递(可通过ObjectResult.Value访问)。我发现这个问题(HowdoIaccessinternalsinasp.net5)的答案是使用动态并将[assembly:InternalsVisibleTo("Namespace")]添加到AssemblyInfo.cs,允许测试项目访问内部对象属性匿名对象。但是,最新版本的ASP.NETCoreMVC没有AssemblyInfo.cs,并且链接问题的答案中添加一个的建议也不起作用。现在有不同的地方可以添加InternalsVisibleTo还是我遗漏了什么?这个答案的原始想法采用更一般的方法。使用自定义DynamicObject作为封装器通过反射检查值,无需添加InternalsVisibleTopublicclassDynamicObjectResultValue:DynamicObject,IEquatable{privatereadonlyobjectvalue;publicDynamicObjectResultValue(objectvalue){this.value=value;}#regionOperatorspublicstaticbooloperator==(DynamicObjectResultValuea,DynamicObjectResultValueb){//如果两者都为空,或者两者都是同一个实例,则返回true。如果(System.Object.ReferenceEquals(a,b)){返回真;}//如果一个为空,但不是两个都为空,则返回false。如果(ReferenceEquals((object)a,null)||ReferenceEquals((object)b,null)){returnfalse;}//如果字段匹配则返回真:returna.value==b.value;}publicstaticbooloperator!=(DynamicObjectResultValuea,DynamicObjectResultValueb){return!(a==b);}#endregionpublicoverrideIEnumerableGetDynamicMemberNames(){returnvalue.GetType().GetProperties().Select(p=>p.Name);}publicoverrideboolTryGetMember(GetMemberBinder活页夹,出objectresult){//初始化值result=null;//搜索可能的匹配项并获取其值varproperty=value.GetType().GetProperty(binder.Name);if(property!=null){//如果找到属性,//设置value参数并返回true。varpropertyValue=property.GetValue(value,null);结果=属性值;返回真;}//否则,返回false。返回假;}publicoverrideboolEquals(objectobj){if(objisDynamicObjectResultValue)returnEquals(objasDynamicObjectResultValue);//如果参数为null则返回false。如果(ReferenceEquals(obj,null))返回false;//如果字段匹配则返回真:returnthis.value==obj;}publicboolEquals(DynamicObjectResultValueother){//如果参数为null,则返回false。如果(ReferenceEquals(other,null))返回false;//如果字段匹配则返回真:returnthis.value==other.value;}publicoverrideintGetHashCode(){returnToString().GetHashCode();}公共覆盖stringToString(){returnstring.Format("{0}",value);}}假设有如下控制器publicclassFooController:Controller{publicIActionResultGetAnonymousObject(){varjsonResult=new{id=1,name="Foo",type="Bar"};返回确定(jsonResult);}publicIActionResultGetAnonymousCollection(){varjsonResult=Enumerable.Range(1,20).Select(x=>new{id=x,name="Foo"+x,type="Bar"+x}).ToList();返回确定(jsonResult);}}测试可能看起来像上面的那样做单元测试吗?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——//Actvarresult=controller.GetAnonymousObject()asOkObjectResult;//断言dynamicobj=newDynamicObjectResultValue(result.Value);断言.IsNotNull(obj);Assert.AreEqual(1,obj.id);Assert.AreEqual("Foo",obj.name);Assert.AreEqual(3,obj.name.Length);Assert.AreEqual("Bar",obj.type);}[测试方法]publicvoidTestDynamicCollection(){//排列varcontroller=newFooController();//Actvarresult=controller.GetAnonymousCollection()asOkObjectResult;//断言Assert.IsNotNull(result,"没有从操作方法返回ActionResult。");动态jsonCollection=result.Value;foreach(jsonCollection中的动态值){dynamicjson=newDynamicObjectResultValue(value);Assert.IsNotNull(json.id,"JSON记录不包含"id"必需的属性。");Assert.IsNotNull(json.name,"JSON记录不包含"name"所需的属性。");Assert.IsNotNull(json.type,"JSON记录不包含"type"必需的属性。");}}本文采集自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除,如需转载请注明出处: