如何在ViewModel中单元测试OnPropertyChanged事件处理程序

时间:2014-10-29 15:28:33

标签: c# wpf unit-testing mvvm

我遇到了单元测试视图模型的以下问题。

在我的项目中,有多个视图模型(让我们说A,B,C和D)。 视图模型A是主视图模型,它处理来自View模型B,C和D的PropertyChanges,然后更新主视图。

View Model A中的大多数方法/属性都是可单元测试的,除了处理来自B,C和D的propertychanged事件的事件处理程序方法。

例如:

public A()
{
  b.PropertyChanged += b_PropertyChanged;
  c.PropertyChanged += c_PropertyChanged;         
}


protected void b_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
  //process something based on the e.PropertyName 
  //might call some private or protected methods here to help with the processing
  switch(e.Property)
  {
     case "SearchResults":
        SearchResults = b.SearchResults;
        break;
  }   
}

如何在不公开测试b_PropertyChanged的情况下进行测试?

2 个答案:

答案 0 :(得分:2)

您可以创建一个包装类来执行此操作(请参阅下文),只需在其位置使用testable类,它就会执行代码。

public class Program
{
    private static void Main(string[] args)
    {
        TestableProgram2 tp = new TestableProgram2();
        tp.b_PropertyChanged(new Program(), "bang");
    }
}

public class Program2
{
    protected void b_PropertyChanged(object sender, string e)
    {
        Debug.Write(e);
    }
}

public class TestableProgram2 : Program2
{
    public new void b_PropertyChanged(object sender, string e)
    {
         e = "altered";       // here to demonstrate this code is entered.
        base.b_PropertyChanged(sender, e);
    }
}

答案 1 :(得分:1)

在这些情况下,习惯上将功能移出事件处理程序并移动到可以独立调用的自己的方法中。你可以尝试这样的事情:

protected void b_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    YourNewMethod(e.Property);
}

public void YourNewMethod(string propertyName)
{
    switch(propertyName)
    {
       case "SearchResults":
          SearchResults = b.SearchResults;
          break;
    }   
}

测试时,您现在可以调用YourNewMethod来测试该功能。