如何为具有受保护方法的内部类型类编写nunit测试用例
本文关键字:类型 测试用例 nunit 内部 方法 受保护 | 更新日期: 2023-09-27 18:20:40
如何为具有受保护方法的内部类型的类编写Nunit测试用例。我应该使用继承吗?下面是我试图为其编写测试用例的类:-
internal class CSGetBuyerAbuseReportsRequestTanslator
{
protected override CSGetBuyerAbuseReportsRequestType BusinessToService(IEntityTranslatorService service, BuyerAbuseRequest value)
{
//code
}
}
请建议我如何为这门课编写测试用例?
我假设您有一个单独的包含单元测试的程序集。如果是这样,您可以在正在测试的程序集的AssemblyInfo.cs文件中添加一行,类似于以下内容(将单元测试程序集的名称替换为AssemblyB
):
[assembly: InternalsVisibleTo("AssemblyB")]
这将允许单元测试程序集访问正在测试的程序集中包含的internal
类。请参阅MSDN的这篇文章,其中介绍了以下关于InternalsVisibleTo
:的使用
这特别方便。。。当测试代码在单独的程序集中运行,但需要访问被测试程序集中标记为Friend(Visual Basic)或internal的成员(C#)时。
如果要显式测试受保护的方法,则应该使用Test-Specific子类。
最简单的例子如下:
internal class CSGetBuyerAbuseReportsRequestTanslatorTSS : CSGetBuyerAbuseReportsRequestTanslator
{
public CSGetBuyerAbuseReportsRequestType ExposeBusinessToService(IEntityTranslatorService service, BuyerAbuseRequest value)
{
return BusinessToServic(service, value);
}
}
在测试中,您将能够通过Test-Specific子类中的公共方法调用受保护的方法。
[TestFixture]
public class SubclassTests
{
[Test]
public void Test()
{
var sut = new CSGetBuyerAbuseReportsRequestTanslatorTSS();
//arrange your system under test here
//...
var result = sut.ExposeBusinessToService(service, value);
Assert.AreEqual(expectedResult, result);
}
}
另一种选择是使用反射:
[TestFixture]
public class ReflectionTests
{
[Test]
public void Test()
{
var sut = new CSGetBuyerAbuseReportsRequestTanslator();
//arrange your system under test here
//...
var result = sut.GetType()
.GetMethod("BusinessToService", BindingFlags.NonPublic)
.Invoke(result, new [] {service, value});
Assert.AreEqual(expectedResult, result);
}
}
但是,如果不能通过类的公共接口进行测试,则应该考虑拆分类。
在本例中,您的类是内部的,如果您在单独的程序集中有测试,则应使用InternalsVisibleToAttribute
才能从测试程序集中访问它。