代码之家  ›  专栏  ›  技术社区  ›  CK__

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

  •  2
  • CK__  · 技术社区  · 10 年前

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

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

    请告诉我如何为这门课编写测试用例?

    2 回复  |  直到 10 年前
        1
  •  7
  •   hunch_hunch ElektroStudios    10 年前

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

    [assembly: InternalsVisibleTo("AssemblyB")]

    这将允许您的单元测试程序集访问 internal 您正在测试的程序集中包含的类。看见 this MSDN post ,其中说明了以下关于 InternalsVisibleTo :

    这特别方便。。。当测试代码在单独的程序集中运行,但需要访问被测试程序集中标记为 朋友 (Visual Basic)或 内部的 (C#)。

        2
  •  3
  •   filhit    10 年前

    你应该使用 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 以便能够从测试程序集访问它。