我创建了一个与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
)
答案 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工作