【问题标题】:writing unit tests against a treeview针对树视图编写单元测试
【发布时间】:2012-04-20 16:11:23
【问题描述】:

我在 silverlight 应用程序的 viewModel 中有类似以下内容:

 public void OnSelectedItemChanged(TreeView treeView)
    {
        if (treeView.SelectedItem is Customer)
        {
            var customer = treeView.SelectedItem as Customer;

            if (customer.IsSpecial)
            {
                treeView.SelectItem(specialNode);
              ...
        }
    }

不要在意逻辑(仅用于演示)。该应用程序工作正常。我的问题与为此方法编写单元测试严格相关。我似乎无法创建一个测试工具来使用我可以成功执行 SelectedItem 或 SelectItem 之类的事情。换句话说,我需要在我的设置中做这样的事情。

 TreeView tv = new TreeView();
 var item = new TreeViewItem();

 tv.ItemsSource = new List<object> { item };
 tv.SelectItem(item); // does not work

有什么方法可以测试这个方法吗?

【问题讨论】:

  • 你能写自动化 UI 测试吗?
  • 这是在 Silverlight、WPF 等中使用 MVVM 的一大原因——可测试性。使用 UI 元素绑定到的纯代码视图模型,我们可以测试所有逻辑,而无需考虑 UI 元素。
  • 请允许我重新表述这个问题 - 在我的视图模型中,我有一个视图绑定到的 ICommand(使用 SelectedItemChanged 事件作为源)。现在如何测试命令?该命令是我上面显示的代码。

标签: c# silverlight unit-testing tdd


【解决方案1】:

单元测试通常用于测试单一功能的单一代码单元,主要用于确认业务逻辑。

有可用的基于 UI 的测试框架,您可能想研究一下。或者您可以使用 ROBOT 等自动化 UI 测试框架。

也就是说,如果您尝试对树形视图进行单元测试,那么这可能表明模块化代码不正确,您应该能够在单独的函数中取出基于单元测试的代码并对该函数进行单元测试。如果那不可能,那么您很可能不需要单元测试。

【讨论】:

  • 我不同意。尝试在测试中包含整个系统。只有当这变得太生硬时,您才应该测试较小的零件。此外,WPF 中的 ViewModel 非常适合测试。
  • 单个单元测试不应该尝试测试整个系统,这就是集成测试的目的。如果您指的是单元测试覆盖率,那么理想的数字是大约 80% 的覆盖率,而 100% 的覆盖率只是意味着太多无用的测试。
  • 在这种情况下,更喜欢编写 Beeish 所谓的集成测试(但不包括外部系统,如数据库)。测试小部件会导致设计脆弱,您的测试会阻碍重构而不是启用重构。另外,我建议不要测量代码覆盖率。
  • 单元测试是衡量每个系统质量的标准。没有单元测试意味着没有质量。单元测试和集成测试是两个不同目标所需的两种不同的东西。 @Kalin,我建议您阅读单元测试:)。
  • 大约十年前我开始练习 TDD。我曾经也有和你类似的观点。但我们只是说我们不同意,然后就这样吧。
猜你喜欢
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 2015-01-16
  • 1970-01-01
  • 2015-03-12
相关资源
最近更新 更多