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

C#使用内部属性设置器模拟类分享

时间:2023-04-10 15:54:10 C#

C#学习教程:使用内部属性设置器的C#模拟类类位置在第三方库中实现。但是对于我的单元测试,我需要将Size属性设置为特定值。公共课位置{私人双_size;privatedoubleSize{get{return_size;}内部设置{_size=值;我读了这篇文章:Howtocreateunittestsstubsforinterfacescontainingreadonlymembers?但无法弄清楚如何让它为我工作。这是被测试的类(只是一个简化的例子)。CalcPositionMetric()方法中的pos参数必须是Position类型:publicclassPositionMetrics{publicPositionMetrics(){}publicdoubleCalcPositionMetric(Positionpos){return2*pos.Size;这是我的单元测试的一部分:使用NUnit.Framework;使用NMock;[TestFixture]publicclassPositionUnitTests{[Test]publicvoidTestPosition(){MocktmpPosMock=mFactory.CreateMock();tmpPosMock.Expects.One.GetProperty(v=>v.Size).WillReturn(7);/*!!!例外!!!System.ArgumentException:模拟对象位置有属性Size的getter,但它不是虚拟的或抽象的*//*ExecuteTestwithtmpPositions*/PositionMetricspm=newPositionMetrics();双结果=pm.CalcPositionMetric(tmpPosMock.MockObject)Assert.AreEqual(14,结果);但是正如你所看到的,我得到了一个例外。有人可以帮我解决这个问题吗?也欢迎任何其他解决方案!干杯康斯坦丁更新问题的新答案我建议你为此引入某种代理接口。请参阅以下代码:interfaceIPosition{intSize{get;}}classPosition{//在第3方库中publicintSize{get{return5;}}}classRealPosition:IPosition{//使用这个作为你的真实对象而不是直接使用PositionprivatePositionposition;publicRealPosition(Position位置){this.position=position;}publicintSize{get{returnposition.Size;}}}classMockPosition:IPosition{//使用它来测试publicintSize{get;放;}}publicclassProgram{staticvoidMain(string[]args){varpos=newMockPosition{Size=7};Console.WriteLine(Calc(pos));//打印14Console.ReadLine();}staticintCalc(IPositionpos){//更改您的方法签名以使用接口returnpos.Size*2;}}旧答案如果课程没有密封,则不需要任何模拟库。只需为您想要的属性使用new修饰符,如下所示:classPosition{publicintSize{get{return5;}}}classMockPosition:Position{publicnewintSize{get;放;}}....varmock=newMockPosition();模拟.Size=7;要使用某种列表中的项目,您必须像这样转换它们:varitems=newList();对于(inti=0;i()){Console.Write("{0}t",item.Size);//prints01234}如果是sealed,属性不是virtual,那么你就得用其他的技术,Moq(我觉得你用的)不允许这样做上面是C#学习教程:C#使用内部属性设置器来模拟类的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: