【发布时间】:2011-03-22 19:37:08
【问题描述】:
我正在编写测试来检查 XAML 中指定的Binding 元素的正确性。他们到目前为止工作,唯一的问题是我不知道如何正确地强制数据绑定发生。令人惊讶的是,仅仅在DataContext 中设置一些内容是不够的,在您显示控件/窗口之前不会发生绑定。请不要说我正在编写“单元”测试并且我想避免显示任何窗口。
看看下面的代码:
// This is main class in console application where I have all WPF references added
public class Program
{
[STAThread]
public static void Main()
{
var view = new Window();
BindingOperations.SetBinding(view, Window.TitleProperty, new Binding("Length"));
view.DataContext = new int[5];
//view.Show(); view.Close(); // <-- this is the code I'm trying not to write
Console.WriteLine(view.Title);
}
}
在这里,我正在创建一个窗口并将一个数组作为DataContext 放入该窗口。我将Window.Title 绑定到Array.Length,所以我希望看到数字5 打印在控制台中。但是直到我Show 窗口(注释行)我会得到空字符串。如果我取消注释该行,那么我将在控制台输出中收到所需的5。
有什么方法可以在不显示窗口的情况下进行绑定?在启动测试时查看大约 20 个窗口非常烦人。
P.S.:我知道我可以让窗口更透明等等,但我正在寻找更优雅的解决方案。
更新 上面的代码是我真正拥有的简化版本。在实际代码中,我收到一个View(一些带有绑定的UIElement)和object ViewModel。我不知道在View 上设置了哪些确切的绑定,但我仍然希望将它们全部初始化。
更新 2:回答有关我测试什么以及为什么测试的问题。我不打算测试Binding、BindingBase 等类是否按预期工作,我假设它们正在工作。我正在尝试在我的所有 XAML 文件中测试我是否正确编写了绑定。因为绑定是字符串类型的东西,所以它们在编译期间不会被验证,默认情况下它们只会导致输出窗口中的错误,我偶尔会错过。因此,如果我们从上面举我的例子,如果我们在绑定中打错:{Binding Lengthhh},那么我的测试会通知你没有名称为Lengthhh 的属性可用于绑定。所以我有大约 100 个 XAML 文件,并且对于每个 XAML,我都有一个测试(3-5 行代码),在启动我的测试后,我知道肯定我的解决方案中没有绑定错误。
【问题讨论】:
-
你试过调用view.UpdateLayout()还是view.InvalidateVisual()?
-
@Aaron,现在试过了,没用。
-
@Snowbear 您是否在标准 WPF 应用程序中尝试过这些不同的方法?
-
@Snowbear 测试视图非常困难。为什么不在 xUnit 或您正在使用的任何测试框架中创建 View 的实例,并根据将 DataContext 设置为给定的 ViewModel 来验证控件是否具有预期值?声明单元测试类似于控制台应用程序并没有任何意义……无论您使用什么测试框架,您都在测试视图。
-
@Snowbear 如果您没有测试绑定中的值是否准确,那么您的测试范围很窄,您现在正在尝试测试 .NET FW,这没有意义。
标签: wpf unit-testing data-binding