我来自Java EE世界,但现在我正在开发一个.Net项目。在Java中,当我想测试一个受保护的方法时,它非常简单,只需让具有相同包名的测试类就足够了。 C#有什么类似的东西吗?单元测试受保护的方法有什么好的做法吗?我只发现框架和人们说我应该只测试公共方法。应该可以在没有任何框架的情况下做到这一点......
非常感谢。
您可以继承要在测试类上测试的类。
public class Test1 : SomeClass
{
Asert.AreEqual(1, SomeClass.ProtectedMethod());
}
另一个选择是使用internal
这些方法,然后使用InternalsVisibleTo
允许您的测试程序集访问这些方法。这并不会停止同一程序集中的其他类所使用的方法,但它会阻止它们被不是您的测试程序集的其他程序集访问。
这并没有给你那么多的封装和保护,但它非常简单并且非常有用。
在包含内部方法的程序集中添加到AssemblyInfo.cs
[assembly: InternalsVisibleTo("TestsAssembly")]
您可以在继承要测试的类的新类中公开受保护的方法。
public class ExposedClassToTest : ClassToTest
{
public bool ExposedProtectedMethod(int parameter)
{
return base.ProtectedMethod(parameter);
}
}
您可以使用PrivateObject类访问所有私有/受保护的方法/字段。
PrivateObject是Microsoft单元测试框架中的一个类,它是一个包装器,可以调用通常无法访问的成员进行单元测试。
虽然接受的答案是最好的,但它并没有解决我的问题。从受保护的类派生污染了我的测试类与许多其他东西。最后,我选择将待测试逻辑提取到公共类中并对其进行测试。当然这对每个人都不起作用,可能需要进行一些重构,但如果你一直滚动到这个答案,它可能只会帮助你。 :)这是一个例子
旧情况:
protected class ProtectedClass{
protected void ProtectedMethod(){
//logic you wanted to test but can't :(
}
}
新情况:
protected class ProtectedClass{
private INewPublicClass _newPublicClass;
public ProtectedClass(INewPublicClass newPublicClass) {
_newPublicClass = newPublicClass;
}
protected void ProtectedMethod(){
//the logic you wanted to test has been moved to another class
_newPublicClass.DoStuff();
}
}
public class NewPublicClass : INewPublicClass
{
public void DoStuff() {
//this logic can be tested!
}
}
public class NewPublicClassTest
{
NewPublicClass _target;
public void DoStuff_WithoutInput_ShouldSucceed() {
//Arrange test and call the method with the logic you want to test
_target.DoStuff();
}
}