gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:11:26 24 4
gpt4 key购买 nike

我有以下功能,我需要知道如何为它编写一个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相当陌生,所以我可能不太了解。

最佳答案

因此,有好消息,有坏消息。
好消息-是的,即使在免费的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功能,然后将测试完全隔离,没有副作用:
[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伪造品的简介: https://msdn.microsoft.com/en-us/library/hh549175.aspx

关于c# - 如何对全局错误处理程序进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42647323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com