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