2

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

4

1 回答 1

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将调用转发给 real 的包装器在哪里WebBrowser,因为它不是密封的,它可以被伪造。原始回调将不会被测试,但那里的逻辑几乎没有意义,因为它只是将对象转换为包装器。

如果您不受 Rhino 的限制,也许您可​​以使用支持密封成员假的 Isolation 框架。例如,使用Isolator它将如下所示:

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

除了 Isolator 之外,还有其他框架支持伪造的密封成员/类。
免责声明 - 我在 Typemock 工作

于 2013-07-25T09:03:59.030 回答