Sco*_*ock 8 wpf unit-testing visualtreehelper
我有这个静态辅助函数:
public static DependencyObject GetParentObject(DependencyObject child)
{
if (child == null) return null;
ContentElement contentElement = child as ContentElement;
if (contentElement != null)
{
var parent = ContentOperations.GetParent(contentElement);
if (parent != null) return parent;
var fce = contentElement as FrameworkContentElement;
return fce != null ? fce.Parent : null;
}
//if it's not a ContentElement, rely on VisualTreeHelper
return VisualTreeHelper.GetParent(child);
}
Run Code Online (Sandbox Code Playgroud)
它适用于实际应用程序,但我正在尝试为它编写一些单元测试.这是我的第一次尝试:
[Test]
public void GetParentObject_returns_immediate_parent()
{
var contentControl = new ContentControl();
var textBox = new TextBox();
contentControl.BeginInit();
contentControl.Content = textBox;
contentControl.EndInit();
var result = UIHelper.GetParentObject(textBox);
Assert.AreSame(contentControl, result);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是它因为VisualTreeHelper返回null 而失败.如何模拟可行的可视树?
这就是静力学存在问题的原因。
您可以抽象接口背后的功能并创建使用静态方法的默认实现。然后,您可以使用依赖项注入,这使得此单元测试变得微不足道 - 模拟对 IVisualTreeHelper 的依赖项或滚动您自己的存根实现,您可以将其配置为返回您分配的任何值。
public class Foo
{
static IVisualTreeHelper visualTreeHelper;
static Foo()
{
Foo.visualTreeHelper = new FrameworkVisualTreeHelper();
}
public Foo(IVisualTreeHelper visualTreeHelper)
{
Foo.visualTreeHelper = visualTreeHelper;
}
public static DependencyObject GetParentObject(DependencyObject child)
{
if (child == null) return null;
ContentElement contentElement = child as ContentElement;
if (contentElement != null)
{
var parent = ContentOperations.GetParent(contentElement);
if (parent != null) return parent;
var fce = contentElement as FrameworkContentElement;
return fce != null ? fce.Parent : null;
}
//if it's not a ContentElement, rely on the IVisualTreeHelper
return visualTreeHelper.GetParent(child);
}
}
public interface IVisualTreeHelper
{
DependencyObject GetParent(DependencyObject reference);
}
public class FrameworkVisualTreeHelper : IVisualTreeHelper
{
public DependencyObject GetParent(DependencyObject reference)
{
return VisualTreeHelper.GetParent(reference);
}
}
Run Code Online (Sandbox Code Playgroud)
VisualTreeHelper显然,如果您在其他地方使用其他方法,您可能需要向接口和默认实现添加其他方法。
它仍然不完全干净,因为您正在测试的单元本身是静态的,当您尝试对依赖于 UIHelper 类的静态方法的任何类进行单元测试时,您将遇到完全相同的问题。
| 归档时间: |
|
| 查看次数: |
1099 次 |
| 最近记录: |