如何对Web浏览器附加属性进行单元测试?

时间:2013-07-25 08:17:14

标签: c# wpf unit-testing tdd rhino-mocks

我创建了一个与WPF 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

1 个答案:

答案 0 :(得分:2)

使用Rhino,你可以使用对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工作