2014-09-05 57 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#)。