fis*_*iso 58 .net c# unit-testing protected
我来自Java EE世界,但现在我正在开发一个.Net项目.在Java中,当我想测试受保护的方法时,它非常简单,只需让具有相同包名的测试类就足够了.C#有什么类似的东西吗?单元测试受保护的方法有什么好的做法吗?我只发现框架和人们说我应该只测试公共方法.应该可以在没有任何框架的情况下做到这一点......
非常感谢.
una*_*ity 66
您可以继承要在测试类上测试的类.
[TestClass]
public class Test1 : SomeClass
{
[TestMethod]
public void MyTest
{
Assert.AreEqual(1, ProtectedMethod());
}
}
Run Code Online (Sandbox Code Playgroud)
Ric*_*ide 25
另一种选择是使用internal这些方法,然后使用InternalsVisibleTo允许测试程序集访问这些方法.这并不会停止同一程序集中的其他类所使用的方法,但它会阻止它们被不是您的测试程序集的其他程序集访问.
这并没有给你那么多的封装和保护,但它非常简单并且非常有用.
添加到AssemblyInfo.cs包含内部方法的程序集中
[assembly: InternalsVisibleTo("TestsAssembly")]
Run Code Online (Sandbox Code Playgroud)
typ*_*n04 15
您可以在继承要测试的类的新类中公开受保护的方法.
public class ExposedClassToTest : ClassToTest
{
public bool ExposedProtectedMethod(int parameter)
{
return base.ProtectedMethod(parameter);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用反射来调用私有和受保护的方法。
请参阅此处了解更多信息:
http://msdn.microsoft.com/en-us/library/66btctbe.aspx
尽管接受的答案是最好的答案,但它并没有解决我的问题。从受保护的类派生出很多其他东西污染了我的测试类。最后我选择将要测试的逻辑提取到一个公共类中并进行测试。当然,这并不适用于所有人,并且可能需要进行大量重构,但是如果您一直滚动到这个答案,它可能会帮助您。:) 这是一个例子
旧情况:
protected class ProtectedClass{
protected void ProtectedMethod(){
//logic you wanted to test but can't :(
}
}
Run Code Online (Sandbox Code Playgroud)
新情况:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用PrivateObject类访问所有私有/受保护的方法/字段。
PrivateObject是Microsoft单元测试框架中的一个类,该类是一个包装器,可以调用通常无法访问的成员进行单元测试。
| 归档时间: |
|
| 查看次数: |
33323 次 |
| 最近记录: |