單元測試你的類的公共接口上做得最好。所以,我建議你要麼公開,要麼間接測試它(通過你公開的方法)。
至於「是否可以爲這樣的事情創建單元測試?」,這取決於你想要在單元測試的概念上有多純粹,你希望它們如何依賴於用戶,以及究竟是什麼//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
。
+1 - 基本上相同的答案,但你把它完成得更快:)並得到了使用模擬庫卡在那裏。不錯的工作:) – 2011-02-15 08:54:48