2014-09-05 28 views
2

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

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

请,建议我怎么写测试用例这个类?

+2

可能重复[单元测试在C#中的私有方法](http://stackoverflow.com/questions/9122708/unit-testing-private-methods-in-c-sharp) – thumbmunkeys 2014-09-05 07:09:24

+0

@thumbmunkeys,如何调用内部类在测试案例中? – 2014-09-05 07:11:11

+0

答案建议您只能测试公共API。它还表明,如果一个类内的组件可以独立测试,它也可能意味着该类可以分成几个相关的类 – Mick 2014-09-05 07:30:48

回答

3

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

的simpliest例子如下:

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以便能够从测试部件中访问它。

4

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

[assembly: InternalsVisibleTo("AssemblyB")]

这将使你的单元测试组件访问您正在测试的装配中包含的internal类。见this MSDN post,其中指出关于使用InternalsVisibleTo以下:

,这是特别方便...当测试代码在一个单独的组件运行,但需要访问成员在组件被测试标记为朋友(Visual Basic)或内部(C#)。

相关问题