2014-01-23 38 views
0

我想單元測試我的viewmodel,並且我有許多命令,它們只是創建一個新任務並調用一個服務方法,並使用延續獲取結果並將它們綁定到屬性上視圖模型。我對單元測試相當陌生,不確定如何測試這種情況。由於它在任務中運行,我的測試中的斷言發生在服務調用完成之前,並且可以在我的viewmodel上設置任何屬性之前。這是我應該如何測試我的viewmodel?如何對產生任務的ICommand進行單元測試

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

爲什麼不把命令正在執行的工作放到命令調用的同步方法中,然後測試該方法? – Shoe

+0

@Shoe是對的......這是要走的路。 – Sheridan

+1

如果我這樣做,命令是唯一調用它不會我只是將方法設置爲私人然後呢?我公開的唯一原因是單元測試。但是這個理由足以讓這種方法公開嗎? – Nighttrain5150

回答

0

我建議創建一個可以抽象出後臺任務需求的異步命令。在這裏看到一個例子Asynchronous WPF Commands

如果您選擇,您還可以修改您的OnProperyChanged函數來調度UI線程的屬性更改。

這種模式在過去一直適用於我,它相當簡化了ViewModel代碼。

這樣你就可以像測試任何其他功能一樣測試它。