【问题标题】:How to unit test a WebBrowser attached property?如何对 WebBrowser 附加属性进行单元测试?
【发布时间】:2013-07-25 08:17:13
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    使用 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();
    

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

    【讨论】:

    • 我将使用包装器调用,因为我们想继续使用 rhino,主要是因为它是免费的,而且我们是一个大型编码团队。
    猜你喜欢
    • 2017-09-11
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多