2013-07-25 33 views
2

我創建了一個與WPF WebBrowser一起使用的附加屬性。 WebBrowser類是密封的,所以我不能嘲笑它。該代碼與此類似:如何對WebBrowser附屬屬性進行單元測試?

private static void BindableSourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
{ 
    WebBrowser browser = sender as WebBrowser; 
    if (browser != null) 
    { 
     browser.NavigateToString(e.NewValue.ToString()); 
    } 
} 

有沒有測試這種其他的方式,把對生產代碼的一些邏輯,使測試通過(如WebBrowser browser = sender as WebBrowser || sender as TestWebBrowser

回答

2

使用犀牛您可以僞造的方法間接使用包裝調用WebBrowser類。
例如:

private static void BindableSourcePropertyChanged(DependencyObject sender, 
              DependencyPropertyChangedEventArgs e) 
{ 
    WebBrowser browser = sender as WebBrowser; 
    if (browser != null) 
    { 
     BindableSourcePropertyChanged(new MyWebBrowser(browser), e); 
    } 
} 

private static void BindableSourcePropertyChanged(MyWebBrowser browser, 
              DependencyPropertyChangedEventArgs e) 
{ 
     browser.NavigateToString(e.NewValue.ToString()); 
} 

哪裏MyWebBrowser是轉發到真正WebBrowser的叫聲,因爲它不是密封它可以僞造的包裝。原來的回調不會被測試,但邏輯幾乎沒有意義,因爲它只是將對象轉換爲包裝器。

如果你沒有與Rhino綁定,也許你可以使用隔離框架來支持假密封成員。例如,使用Isolator它會看起來像:

var browser = new WebBrowser(); 
Isolate.WhenCalled(() => browser.NavigateToString(null)).IgnoreCall(); 

還有比隔離僞造其他支持封裝的成員,其他框架/班。
免責聲明 - 我的工作在Typemock

+0

我將使用包裝調用,因爲我們想繼續與犀牛,主要是因爲它是免費的,我們是一個大的編碼團隊。 –