如果您想明確測試受保護的方法,則應該使用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
以便能夠從測試部件中訪問它。
可能重複[單元測試在C#中的私有方法](http://stackoverflow.com/questions/9122708/unit-testing-private-methods-in-c-sharp) – thumbmunkeys 2014-09-05 07:09:24
@thumbmunkeys,如何調用內部類在測試案例中? – 2014-09-05 07:11:11
答案建議您只能測試公共API。它還表明,如果一個類內的組件可以獨立測試,它也可能意味着該類可以分成幾個相關的類 – Mick 2014-09-05 07:30:48