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

如何使用MoqShare在C#中对保护进行单元测试

时间:2023-04-11 01:30:13 C#

如何在C#中使用Moq进行单元测试保护最近我注意到您可以使用Moq对抽象基类进行单元测试,而不是创建实现抽象基类的虚拟类测试。请参阅如何使用最小起订量测试抽象类中的具体方法?你可以这样做://行为mock.Object.MyMethod();//Assert//...}现在我想知道是否有类似的技术可以让我测试受保护的成员而无需创建包装类。即你如何测试这个方法:publicclassMyClassWithProtectedMethod{protectedvoidMyProtectedMethod(){}}mock.Protected().Setup("MyProtectedMethod").Verifiable();我也知道这里明显的答案是“不要测试受保护的方法,只测试公共方法”,但这是另一场辩论!我只想知道是否可以使用Moq。更新:这是我正常测试的方式:publicclassMyClassWithProtectedMethodTester:MyClassWithProtectedMethod}}提前致谢。对于初学者来说,单元测试抽象方法没有意义。未实现!你可能想对你的非纯抽象类进行单元测试,验证抽象方法是否被调用:sutMock.Object.Do();sutMock.Verify(x=>x.MyAbstractMethod());}公共抽象类MyAbstractClass{publicvoidDo(){MyAbstractMethod();}publicabstractvoidMyAbstractMethod();请注意,我将CallBase设置为将其转换为Mock部分,以防Do是虚拟的。否则,Moq将替换Do方法的实现。使用Protected()验证受保护的方法是否以类似的方式调用。当您使用Moq或其他库创建模拟时,重点是覆盖实现。测试受保护的方法涉及公开现有的实现。这不是最小起订量的目的。Protected()只是让您可以访问(大概是通过反射,因为它是基于字符串的)来覆盖受保护的成员。使用调用受保护方法的方法编写测试后代类,或者在单元测试中使用反射来调用受保护方法。或者,更好的是,不要直接测试受保护的方法。您已经谈到了“测试公共API,而不是私有API”的思考过程,并且您已经提到了从类继承然后以这种方式测试其受保护成员的技术。两者都是有效的方法。所有这一切的背后是一个简单的事实,即您认为此实现细节(因为这是一个私有或受保护的成员)非常重要,足以直接测试而不是通过使用其公共API间接测试。如果这很重要,那么将其推广到您自己的班级可能很重要。(毕竟,如果它很重要,也许它不应该是MyAbstractClass的责任。)类的实例将在MyAbstractClass中受到保护,因此只有基类和派生类型才能访问该实例,否则类本身将被保护如果需要,可以完全测试,可以在其他地方使用。抽象类MyAbstractClass{protectedImportantMethodDoerdoer;}classImportantMethodDoer{publicvoidDo(){}}否则,您将离开*已经确定的方法。*Moq可能会或可能不会提供某种机制来获取私人或受保护的成员,我不能说,因为我不使用那个特定的工具。我的回答更多来自架构的角度。Moq调用受保护成员的另一种方式是以下模板:在您的类中,受保护成员将您的函数标记为虚函数。例如:publicclassClassProtected{publicstringCallingFunction(Customercustomer){varfirstName=ProtectedFunction(customer.FirstName);varlastName=ProtectedFunction(customer.LastName);返回string.Format("{0},{1}",lastName,firstName);}protectedvirtualstringProtectedFunction(stringvalue){returnvalue.Replace("SAP",string.Empty);}}然后在您的单元测试中添加引用usingMoq.Protected;在您的单元测试中,您可以编写以下内容:mockCustomerNameFormatter.Protected().Setup("ProtectedFunction",ItExpr.IsAny()).Returns("这里可以是任何值").Verifiable();//你应该在任何情况下调用这个函数。不调用nextVerify根本不会给你任何好处//ActmockCustomerNameFormatter.Object.CallingFunction(newCustomer());//断言mockCustomerNameFormatter.Verify();}}记在ItExpr下,应该改用它。另一个问题在Verifiable等着你。我不知道为什么,但如果不调用它就不会调用VerifiableVerify。以上就是《C#学习教程:使用Moq保护C#中的单元测试》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: