如何触发WPF后台转换器进行测试

时间:2017-02-10 07:21:21

标签: c# wpf unit-testing converter

我坐在下面的单元测试前面而没有让它正常工作

[TestMethod]
    public void EvenIndexesZeroShouldHaveWhiteBackground()
    {
        var converterBinding = new Binding("BackgroundConverter");
        converterBinding.Converter = new BackgroundConverter();

        var lvi0 = new ListViewItem() { Background = Brushes.Gray };

        var lv = new ListView();

        lvi0.SetBinding(ListViewItem.BackgroundProperty, converterBinding);

        lv.Items.Add(lvi0);

        Assert.AreEqual(Brushes.White, converterBinding.Converter.Convert(lvi0, null, null, CultureInfo.InvariantCulture));
    }

我能够通过直接调用Convert(...)方法来测试另一个转换器,但它收到了一个简单的数据类型。

我觉得在将{​​{1}}添加到lvi0时(或之后手动)我需要触发转换器,但我不知道该怎么做。

有人能指出我正确的方向吗?

我是WPF的新手,并且尚未完全了解Bindings和Dependency Properties :(

[UPDATE] 目前的问题是没有调用ListView方法。它不是转换器的内容或它返回的结果。

[更新2] @Tatranskymedved评论指出我正确的方向,并直接调用转换器(由@PeterDuniho提出)现在工作。我已相应更新了上面的代码段。

[更新3] 这是转换器。我必须传入ListViewItem,因为它正在处理它。目前无法改变它。

Convert

1 个答案:

答案 0 :(得分:1)

基本思想是:在WPF中您使用的是Window / UserControl,其中包含布局和控件。如果任何控件应将其属性绑定到ViewModel,则Control的属性必须定义为DependencyProperty。如果您只是使用了一些已定义的控件,则无需了解它们。

当您创建自己的UserControl时,它必须有DependencyProperty,因此您可以将一端绑定到它。

现在您必须意识到,您想要测试什么。它是绑定吗?还是转换器本身?

对于绑定测试,您可以参考:Unit test WPF Bindings

或者:http://www.wpf-tutorial.com/data-binding/debugging/

但是,谈到单元测试,您应该直接测试Converter,而不是将它们放到像Binding这样复杂的链对象上。如果测试不起作用,那就是基本的动机,你可以说&#34;问题在于Converter&#34;,而不是你要绑定的绑定或对象。< / p>

只有您需要检查您设置的值的类型是否正确。对于WPF控制BackgroundProperty,它应该System.Windows.Media.BrushMSDN一样。