如何对生成任务的ICommand进行单元测试

时间:2014-01-23 16:58:36

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

我正在尝试对我的viewmodel进行单元测试,并且我有许多命令只是创建一个新任务并调用服务方法并使用continuation获取结果并将它们绑定到viewmodel上的属性。我对单元测试很新,不知道如何测试这种情况。由于它在一个任务中运行,我的测试中的断言发生在服务调用完成之前和我可以在我的viewmodel上设置任何属性之前。这是我应该如何单元测试我的viewmodel?

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);
}

1 个答案:

答案 0 :(得分:0)

我建议创建一个可以抽象出后台任务需求的异步命令。请参阅此处以获取一个示例Asynchronous WPF Commands

如果您选择,您还可以修改OnProperyChanged函数以将属性更改发送到UI线程。

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

通过这种方式,您可以像测试任何其他功能一样进行测试。