最好在类的公共接口上进行单元测试。所以,我建议你要么公开它,要么间接测试它(通过你公开的公共方法)。
至于“是否可以为这样的东西创建单元测试?”,这取决于您希望对单元测试概念的纯洁程度,您希望它们对用户的依赖程度,以及具体做什么//show a custom message
。
你希望你的单元测试有多纯粹?如果您不在乎它们是否是肮脏的黑客,那么您可以使用反射将私有方法公开给您的单元测试,然后直接调用它。但是,这通常是一种不好的做法,因为根据定义,您的私有函数可能会发生变化。否则,您只会将它们公开。
如果//show a custom message
打印到控制台,那么您可以相当轻松地进行静默运行测试。如果你真的想验证输出,你必须挂钩到你的Console.Out
,这样你就可以看到打印了什么,并添加相应的断言。
如果//show a custom message
使用MessageBox.Show
,那么您可能必须进行 UI 自动化测试才能对此进行测试。您的测试将无法在后台静默运行,并且如果您在测试运行时移动鼠标将会中断。
如果您不想仅仅为了测试这个类的逻辑而进行 UI 自动化测试,那么我所知道的最好的方法是修改您的类以使用依赖注入。将所有实际输出代码 ( MessageBox.Show
) 封装到另一个类中,通过接口或抽象基类对其进行抽象,并使原始类引用抽象类型。这样你就可以在你的测试中注入一个模拟,它实际上不会输出到屏幕上。
public interface INotification
{
void ShowMessage(string message);
}
public class MessageBoxNotification : INotification
{
public void ShowMessage(string message)
{
MessageBox.Show(message);
}
}
public class MyClass
{
private INotification notification;
public MyClass(INotification notification)
{
this.notification = notification;
}
public void SomeFunction(int someValue)
{
// Replace with whatever your actual code is...
ToDate toDate = new SomeOtherClass().SomeOtherFunction(someValue);
CheckToDate(toDate);
}
private void CheckToDate(DateTime ToDate)
{
if (Manager.MaxToDate < ToDate.Year)
notification.Show("toDate, too late!: " + toDate.ToString());
}
}
您的单元测试将使其成为自己的自定义INotification
类,将其传递给 的构造函数MyClass
,然后调用该SomeFunction
方法。
您可能希望抽象出诸如 之类的东西,并且这些类以类似的方式Manager
涉及计算。ToDate