2011-10-08 56 views
1

我正在为WP7中的一个应用程序进行单元测试。我想检查button_click函数是否正常工作。当我试图从我单位testcode 调用button_click功能类似下面从WP7中的UnitTest代码执行时,处理程序没有被调用

 CheckUrVacabolary.MainPage cpage = new CheckUrVacabolary.MainPage(); 
     cpage.txtFind.Text = "home"; 
     cpage.butMeaning_Click(cpage,null); 

但button_click(OnDefineInDictCompleted)
内的事件处理程序(OnDefineInDictCompleted)是没有得到调用。这里是代码

internal void butMeaning_Click(object sender, RoutedEventArgs e) 
    { 
     graphPass.Visibility = Visibility.Collapsed; 
     graphFail.Visibility = Visibility.Collapsed; 

     if (txtFind.Text.ToString() != "Enter the word") 
     { 
      butNext.IsEnabled = true; 
      DictServiceSoapClient client = GetDictServiceSoapClient(); 
      String meaningfor; 
      if (txtRandomWord.Text.Trim().Length != 0) 
      { 
       txtRandomWord.Text = ""; 
       meaningfor = wordToGuess; 
      } 
      else 
      { 
       meaningfor = txtFind.Text.Trim().ToString(); 
      } 

      if (meaningfor.Length != 0) 
      { 
       client.DefineInDictCompleted += 
        new EventHandler<DefineInDictCompletedEventArgs 
          (OnDefineInDictCompleted); 
       client.DefineInDictAsync("gcide", meaningfor); 
      } 
     } 
    } 

我没有在我的应用程序中使用MVVM模型。有什么办法我也可以调用事件处理程序。

回答

1

简单的答案是:不要使用MVVM。它的好处之一是更简单的单元测试。但是,如果你选择不这样做,你应该在一个类似服务的类中创建一个单独的方法,该方法由事件处理程序调用,但也可以从单元测试中调用。

该方法应该只包含要测试的业务逻辑而不包含UI行为。 (使用视图模型,您甚至可以测试UI行为,因为它是抽象的)。这意味着它应该有你从控制中获得的值的参数,如txtRandomWord

client连接到的事件处理程序是一个问题。

首先,您通过按下按钮创建的每个client实例的生命周期扩展到页面的生命周期,这会引入潜在的memory leak

其次,我认为OnDefineInDictCompleted是您的页面中的一种方法,所以您应该从页面中提取该方法,以便可以通过单元测试访问它。如果该方法涉及UI元素,这可能是一个真正的头痛。再次,视图模型的一个强有力的例子。

相关问题