如何为具有受保护方法的内部类型类编写nunit测试用例



如何为具有受保护方法的内部类型的类编写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才能从测试程序集中访问它。

最新更新