如何对全局错误处理程序进行单元测试?

时间:2017-03-07 11:37:08

标签: c# unit-testing error-handling

我有以下功能,我需要知道如何为它编写UnitTest。 (HandleError函数)

    public partial class App : Application
{
    public App()
    {
        this.Startup += App_Startup;
        Dispatcher.UnhandledException += HandleError;
    }
     private void HandleError(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        string exception = e.Exception.Message;
        MessageBox.Show(exception + "\"", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
        e.Handled = true;
    }
}

我对UnitTest相当新,所以我可能不太了解。

1 个答案:

答案 0 :(得分:0)

所以,有好消息,有坏消息。 好消息 - 是的,即使在免费的Visual Studio中,您也可以进行单元测试。 坏消息 - 因为您使用静态MessageBox.Show单元测试实际上会导致显示实际的框。

单元测试代码:

    [TestMethod]
    public void App_Handles_Exceptions()
    {
      var app = new App();
      var dapp = (DispatcherObject)app;
      var mi = typeof(Dispatcher).GetMethod("CatchException", BindingFlags.Instance | BindingFlags.NonPublic);
      var handled = (bool)mi.Invoke(dapp.Dispatcher, new object[] { new Exception("a") });

      Assert.IsTrue(handled);
    }

现在,如果您碰巧拥有Visual Studio的企业版(遗憾的是,即使2017年需要它),您也可以使用Microsoft Fakes功能,然后测试完全隔离,没有任何副作用:< / p>

[TestMethod]
public void App_Handles_Exceptions_WithFakes()
{
  using (ShimsContext.Create())
  {
    string usedMessage = null;
    string usedError = null;
    System.Windows.Fakes.ShimMessageBox.ShowStringStringMessageBoxButtonMessageBoxImage = (s, s1, arg3, arg4) =>
      {
        usedMessage = s;
        usedError = s1;
        return MessageBoxResult.OK;
      };

    var app = new App();
    var dapp = (DispatcherObject)app;
    var mi = typeof(Dispatcher).GetMethod("CatchException", BindingFlags.Instance | BindingFlags.NonPublic);
    var handled = (bool)mi.Invoke(dapp.Dispatcher, new object[] { new Exception("a") });

    Assert.IsTrue(handled);
    Assert.AreEqual("a\"", usedMessage);
    Assert.AreEqual("Error", usedError);
  }
}

这是Microsoft Fakes的简介:https://msdn.microsoft.com/en-us/library/hh549175.aspx