C#学习教程:针对特定异常的异步方法单元测试给定一个带有异步方法的类publicstaticclassAsyncMathsStatic{privateconstintDELAY=500;publicstaticasyncTaskDivide(intA,intB){awaitTask.Delay(DELAY);如果(B==0)抛出新的DivideByZeroException();否则返回A/B;我想使用新的Async.ExpectsException结构编写一个测试方法。我试过:-[TestMethod]publicvoidDivideTest1(){Assert.ThrowsException(async()=>{intResult=awaitAsyncMathsStatic.Divide(4,0);});但是当然测试不会等待异步方法完成,从而导致测试失败,但没有抛出异常。您可以使用带有常规ExpectedExceptionAttribute的异步Taskunit测试:[TestMethod][ExpectedException(typeof(DivideByZeroException))]publicasyncTaskDivideTest1(){intResult=awaitAsyncMathsStatic.Divide(4,0);}评论更新:Win8unittesting项目中的ExpectedExceptionAttribute已替换为Assert.ThrowsException,这是很好地未记录的AFAICT。这在设计上是一个很好的改变,但我不知道为什么它只在Win8上支持。好吧,假设没有异步兼容的Assert.ThrowsException(由于缺少文档无法判断是否有),您可以自己构建一个:publicstaticclassAssertEx{publicasyncTaskThrowsExceptionAsync(Funccode){try{await代码();}catch(Exceptionex){if(ex.GetType()==typeof(TException))返回;thrownewAssertFailedException("不正确的类型;预期...得到...",ex);}thrownewAssertFailedException("没有看到预期的异常......");然后使用它:[TestMethod]publicasyncTaskDivideTest1(){awaitAssertEx.ThrowsException(async()=>{intResult=awaitAsyncMathsStatic.Divide(4,0);});请注意,我的示例只是对异常类型的精确检查;您可能还希望允许后代类型。2012-11-29更新:打开UserVoice建议,将其添加到VisualStudio。[TestMethod]publicvoidDivideTest1(){Funcaction=async()=>{intResult=awaitAsyncMathsStatic.Divide(4,0);});行动.ShouldThrow();使用.ShouldThrow()nuget包对我有用几天前我遇到了类似的问题并最终创建了类似于上面斯蒂芬的回答的东西。它可以用作要点。希望它有所帮助-githubgist有完整的代码和示例用法。//////异步断言与Microsoft.VisualStudio.TestPlatform.UnitTestFramework一起使用///publicstaticclassAsyncAsserts{//////验证在执行异步时是否抛出类型异常。///如果没有抛出异常则断言失败//////预期抛出的通用异常///预期抛出异常的异步Func///表示异步操作的任务对象。publicstaticasyncTaskThrowsException(Funcfunc)whereT:Exception{returnawaitThrowsException(func,null);}//////验证异步执行时是否抛出异常类型。///如果没有异常抛出则断言失败//////预期抛出的通用异常///预期抛出异常的异步Func///断言失败时显示的消息.可以在单元测试结果中看到此消息。///代表异步操作的任务对象配给。publicstaticasyncTaskThrowsException(Funcfunc,stringmessage)whereT:Exception{if(func==null){thrownewArgumentNullException("func");}}字符串失败消息;尝试{等待函数();}catch(Exceptionexception){if(!typeof(T).Equals(exception.GetType())){//“抛出异常{2},但异常{1}是预期的。{0}nException消息:{3}nStackTrace:{4}"failureMessage=string.Format(CultureInfo.CurrentCulture,FrameworkMessages.WrongExceptionThrown,message??string.Empty,typeof(T),exception.GetType().Name,exception.Message,exception.StackTrace);失败(失败消息);}else{返回(T)异常;}}//“没有抛出异常。预期有{1}个异常。{0}”failureMessage=string.Format(CultureInfo.CurrentCulture,FrameworkMessages.NoExceptionThrown,message??string.Empty,typeof(T));失败(失败消息);返回默认值(T);}privatestaticvoidFail(stringmessage,[CallerMemberName]stringassertionName=null){stringfailureMessage=string.Format(CultureInfo.CurrentCulture,FrameworkMessages.AssertionFailed,assertionName,message);抛出新的AssertFailedException(failureMessage);支持在ThrowsException方法中使用异步lambdas自VisualStudio2012Update2支持,但仅适用于Windows应用程序商店测试项目一个问题是您需要使用Microsoft.VisualStudio.TestPlatform.UnitTestFramework.AppContainer.Assert类来调用抛出异常。因此,要使用新的ThrowsException方法,可以如下操作:以上是C#学习教程分享的全部内容:针对特定异常的异步方法单元测试。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——usingAsyncAssert=Microsoft.VisualStudio.TestPlatform.UnitTestFramework.AppContainer.Assert;[TestMethod]publicvoidDivideTest1(){AsyncAssert.ThrowsException(async()=>{intResult=awaitAsyncMathsStatic.Divide(4,0);});}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
