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

Arg.Is.Equal与匿名对象共享

时间:2023-04-10 16:40:16 C#

Arg.Is.Equal与匿名对象在我的MVC3项目中,我使用IUrlProvider接口来包装UrlHelper类。在我的控制器操作之一中,我有一个这样的调用:stringurl=_urlProvider.Action("ValidateCode",new{code="spam-and-eggs"});我想在我的单元测试方法调用中存根,这是在一个单独的项目中。测试设置如下所示:IUrlProviderurlProvider=MockRepository.GenerateStub();urlProvider.Stub(u=>u.Action(Arg.Is.Equal("ValidateCode"),Arg.Is.Equal(new{code="spam-and-eggs"}))).Return("http://www.mysite.com/validate/spam-and-eggs");不幸的是,Arg.Is.Equal(new{code="spam-and-eggs"})不起作用,因为new{code="spam-and-eggs"}!=new{code="spam-and-eggs"}在不同的程序集中声明匿名类型时。那么,是否有一种替代语法可以与RhinoMocks一起使用来检查跨程序集的匿名对象之间的匹配字段值?或者我应该像这样用类替换匿名对象声明吗?公共类CodeArg{公共字符串代码{get;放;}publicoverrideboolEquals(objectobj){if(obj==null||GetType()!=obj.GetType()){returnfalse;}返回码==((CodeArg)obj).code;}publicoverrideintGetHashCode(){returncode.GetHashCode();}}stringurl=_urlProvider.Action("ValidateCode",newCodeArg{code="spam-and-eggs"});IUrlProviderurlProvider=MockRepository.GenerateStub();urlProvider.Stub(u=>u.Action(Arg.Is.Equal("ValidateCode"),Arg.Is.Equal(newCodeArg{code="spam-and-eggs"}))).Return("http://www.mysite.com/validate/spam-and-eggs");编辑如果我的单元测试与我的控制器在同一个项目中,那么比较匿名对象就是这样。因为它们是在单独的程序集中声明的,所以即使它们具有相同的字段名称和值,它们也不相等。比较由不同名称空间中的方法创建的匿名对象似乎不是问题。理解我使用自定义AbstractConstraint将Arg.Is.Equal()替换为Arg.Matches():IUrlProviderurlProvider=MockRepository.GenerateStub();urlProvider.Stub(u=>u.Action(Arg.Is.Equal("ValidateCode"),Arg.Matches(newPropertiesMatchConstraint(new{code="spam-and-eggs"})))).Return("http://www.mysite.com/validate/spam-and-eggs");公共类PropertiesMatchConstraint:AbstractConstraint{privatereadonlyobject_equal;publicPropertiesMatchConstraint(objectobj){_equal=obj;}publicoverrideboolEval(objectobj){if(obj==null){return(_equal==null);}varequalType=_equal.GetType();varobjType=obj.GetType();foreach(varpropertyinequalType.GetProperties()){varotherProperty=objType.GetProperty(property.Name);如果(otherProperty==null||property.GetValue(_equal,null)!=otherProperty.GetValue(obj,null)){returnfalse;}}返回真;}publicoverridestringMessage{get{stringstr=_equal==null?“空”:_equal.To细绳();返回“等于”+str;}}}匿名类型以非常正常的方式实现Equals和GetHashCode,为每个子成员调用GetHashCode和Equals所以这应该通过:Assert.AreEqual(new{code="spam-and-eggs"},new{code="垃圾邮件和鸡蛋"});换句话说,我怀疑你在错误的地方寻找问题。请注意,您必须以完全正确的顺序指定属性-因此new{a=0,b=1}将不等于new{b=1,a=0};这两个对象将是不同的类型。编辑:匿名类型实例创建表达式也必须在同一个程序集中。在这种情况下,这肯定是问题所在。如果Equals允许您指定一个IEqualityComparer,您可以构建一个比较两个具有相同属性的匿名类型的方法,方法是根据另一个实例的属性创建一个类型的实例,然后与相同类型的原始类型进行比较。当然,如果您使用嵌套的匿名类型,则需要递归地进行,这可能会变得很丑陋……因为GetValue返回一个装箱的值,这似乎工作正常。以上就是C#学习教程:Arg.Is.Equalwithanonymousobjects的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——publicclassPropertiesMatchConstraint:AbstractConstraint{privatereadonlyobject_equal;publicPropertiesMatchConstraint(objectobj){_equal=obj;}publicoverrideboolEval(objectobj){if(obj==null){return(_equal==null);}varequalType=_equal.GetType();varobjType=obj.GetType();foreach(varpropertyinequalType.GetProperties()){varotherProperty=objType.GetProperty(property.Name);如果(otherProperty==null||!_ValuesMatch(property.GetValue(_equal,null),otherProperty.GetValue(obj,null))){returnfalse;}}返回真;}//修复盒装转换object:Guid!=object:Guid当两个值是相同的guid-必须调用.Equals()privatebool_ValuesMatch(objectvalue,objectotherValue){if(value==otherValue)return真的;//if(value!=null)returnvalue.Equals(otherValue);//提前返回返回otherValue.Equals(value);}publicoverridestringMessage{get{stringstr=_equal==null?“空”:_equal.ToString();返回“等于”+str;}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: