【问题标题】:How to unit test an ICommand that generates a task如何对生成任务的 ICommand 进行单元测试
【发布时间】:2014-02-14 09:10:00
【问题描述】:

我正在尝试对我的视图模型进行单元测试,并且我有许多命令可以简单地创建一个新任务并调用一个服务方法,并使用延续获取结果并将它们绑定到视图模型上的属性。我对单元测试还很陌生,不确定如何测试这种情况。由于它在任务中运行,因此我的测试中的断言发生在服务调用完成之前以及在我可以在我的视图模型上设置任何属性之前。这是我应该如何对我的视图模型进行单元测试吗?

public ICommand GetItems
{
  if(this.Category != null)
  {
    Task<List<Item>> t = new Task<List<Item>>((o) =>
    {
       return _service.GetItems(this.Category);
    }
    t.ContinueWith((task) =>
    {
       this.Items = task.Result;
    }
    t.Start();
  }
}


[TestMethod]
public void TestGetItems()
{
  var selectedCategory = Category.NewItems;
  var expected = new List<Item>(){ new Item(){ Value = "ExpectedValue" } };
  var service = new Mock<IService>();
  service.Setup(i => i.GetItems(selectedCategory)).Returns(expected);
  var sut = new MainViewModel(_service.Object);
  sut.Category = selectedCategory;
  sut.GetItems.Execute(null);
  Assert.AreEqual(expected, sut.Items);
}

【问题讨论】:

  • 为什么不把命令正在做的工作拉到命令调用的同步方法中,然后测试那个方法?
  • @Shoe 是对的......这就是要走的路。
  • 如果我这样做并且命令是唯一调用它的东西,那么我不只是将方法设置为私有吗?我将其公开的唯一原因是对其进行单元测试。但是,这个理由足以公开该方法吗?

标签: c# .net wpf unit-testing mvvm


【解决方案1】:

我建议创建一个可以抽象出对后台任务的需求的异步命令。一个例子见这里Asynchronous WPF Commands

如果您选择这样做,您还可以将 OnProperyChanged 函数修改为将属性更改分派到 UI 线程。

这种模式过去对我有用,它大大简化了 ViewModel 代码。

这样您就可以像测试任何其他功能一样对其进行测试。

【讨论】:

    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2020-05-21
    • 2013-11-26
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多