如果您想明确测试受保护的方法,则应该使用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