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

时间:2014-09-05 07:08:06

标签: c# .net nunit

如何为具有受保护方法的内部类型编写Nunit测试用例。 我应该使用继承吗? 以下是我试图编写测试用例的类: -

internal class CSGetBuyerAbuseReportsRequestTanslator
{
    protected override CSGetBuyerAbuseReportsRequestType BusinessToService(IEntityTranslatorService service, BuyerAbuseRequest value)
    {
        //code
    }
 }

请建议我如何为这堂课编写测试用例?

2 个答案:

答案 0 :(得分:5)

我假设您有一个包含单元测试的单独程序集。如果是这样,您可以向正在测试的程序集的AssemblyInfo.cs文件中添加一行,类似于以下内容(替换单元测试程序集的AssemblyB名称):

[assembly: InternalsVisibleTo("AssemblyB")]

这将允许您的单元测试程序集访问您正在测试的程序集中包含的internal类。请参阅this MSDN post,其中说明了InternalsVisibleTo的使用情况:

  

这非常方便......当测试代码在单独的程序集中运行但需要访问被测试的程序集中标记为朋友(Visual Basic)或内部<的成员时/ strong>(C#)。

答案 1 :(得分:3)

如果要明确地测试受保护的方法,则应使用Test-Specific subclass

最简单的例子如下:

internal class CSGetBuyerAbuseReportsRequestTanslatorTSS : CSGetBuyerAbuseReportsRequestTanslator
{
    public CSGetBuyerAbuseReportsRequestType ExposeBusinessToService(IEntityTranslatorService service, BuyerAbuseRequest value) 
    {
        return BusinessToServic(service, value);
    }
}

在测试中,您将能够通过特定于测试的子类中的公共方法调用受保护的方法。

[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来从测试程序集中访问它。