using System;
namespace idior
{
public class Tested
{
#if (DEBUG)
public
#else
private
#endif
string PrivateMethod(string str)
{
//do something
return str;
}
}
}
namespace idior
{
public class Tested
{
#if (DEBUG)
public
#else
private
#endif
string PrivateMethod(string str)
{
//do something
return str;
}
}
}
原来的类不变
namespace idior
{
public partial class Tested
{
private string PrivateMethod(string str)
{
//Do something
return str;
}
}
}
{
public partial class Tested
{
private string PrivateMethod(string str)
{
//Do something
return str;
}
}
}
namespace idior
{
[TestFixture]
public partial class Tested
{
Tested tested;
[SetUp]
public void Setup()
{
tested = new Tested();
}
[Test]
public void TestPrivateMethod()
{
Assert.AreEqual(tested.PrivateMethod("hello"), "hello");
}
}
}
{
[TestFixture]
public partial class Tested
{
Tested tested;
[SetUp]
public void Setup()
{
tested = new Tested();
}
[Test]
public void TestPrivateMethod()
{
Assert.AreEqual(tested.PrivateMethod("hello"), "hello");
}
}
}
这两种方法各有优缺点
1 优点:源文件不用引入nunit.framework.dll
缺点:有一定危险,因为当该类被其他类使用的时候,会把这个私有方法当成public
2. 优点:没有危险
缺点:会引入nunit.framework.dll当然你可以把它放到其他文件夹,发布时删除不过麻烦.
还有一个方法就是使用反射,你又会使用哪种?
方法三:
为要测试的类添加一个继承的子类.在子类中实现Get方法实现对私有成员的访问.如果在Java中还可以将这个
子类设为Test中的Inner Class.
优点: 比反射安全,比前面的方法简单.
缺点: private 变量要变成protected
体会:
XUnit只是通过验证interface.主要思想对某个方法的输入验证它的输出.这种黑盒的测试工具能很大程度上保证
代码的安全,并能驱动开发.但是对于方法的执行过程缺少控制,可能需要更加细致的测试工具来实现对方法的
执行过程的测试(这里仍然指得是程序员测试)虽然这种情况不是非常多.AOP或许能为实现这种测试作出贡献.