如何使用Assert.Throws断言异常的类型和实际的消息措辞.
像这样的东西:
Assert.Throws<Exception>(
()=>user.MakeUserActive()).WithMessage("Actual exception message")
Run Code Online (Sandbox Code Playgroud)
我正在测试的方法抛出多个相同类型的消息,使用不同的消息,我需要一种方法来测试是否根据上下文抛出了正确的消息.
我是在尊敬的John Skeet先生的要求下重新发布这个问题的,他建议我设计一个简单的测试程序,隔离并演示我遇到的问题并重新发布问题.这个问题多起来了这一个,所以请原谅我,如果这一切听起来很熟悉.您可以从中收集有关此问题的额外详细信息.
我遇到的问题Assert.Throws<T>来自NUnit 2.5.9.有时,它无法捕获TestDelegate调用的方法中抛出的任何异常.我已经在下面的代码中以可重现的方式确定了这种行为.(尽管如此,这可能是Fails On My Machine™的案例.
为了重现错误,我创建了一个包含两个C#DLL项目的解决方案:
SqlCommand,填充其参数并ExecuteScalar在其上调用所需的逻辑.该项目不包括其他参考.当我在调试器中单步执行测试时,我会观察到以下内容:
Assert.Throws正确调用ExecuteScalar<T>扩展方法.ExecuteScalar<T> 测试其参数的空值.throw new ArgumentNullException(...).throw,应用程序的控制权不会立即转移到Assert.Throws.相反,它继续在下一行ExecuteScalar<T>.下面给出了隔离此行为的源代码.
扩展方法
namespace NUnit_Anomaly
{
using System;
using System.Data;
using System.Data.SqlClient;
public static class Class1
{
public static T ExecuteScalar<T>(this SqlConnection connection, string sql)
{
if (connection == null)
{
throw new ArgumentNullException("connection");
}
if (sql == …Run Code Online (Sandbox Code Playgroud) 去年我第一次开始使用C#进行编程时,我立即寻找了与STL相同的地图,并学习了Dictionary.
更新了下面的垃圾,我完全错了.我与STL的地图的经验是,我讨厌当我要求它的价值,如果关键在地图上没有,它会自动创建值类型(无论其默认构造函数所做的那样),并将其添加到地图中.然后我必须在代码中检查这个条件并抛出异常.
字典<>使整个shebang正确 - 如果键不存在,它会在您请求值时抛出异常,或者如果不是,则自动添加它并且您想要设置该值.
但你们都已经知道了.我应该在发布之前编写我的单元测试并让自己感到尴尬.:)他们现在写的!
现在我喜欢Dictionary和all,但是现在最让我烦恼的是,如果键不在Dictionary中,它会抛出KeyNotFoundException.因此,我总是需要编写如下代码:
Dictionary<string,string> _mydic;
public string this[string key]
{
get {
return _mydic[key]; // could throw KeyNotFoundException
}
set {
if( _mydic.ContainsKey( key))
_mydic[key] = value;
else
_mydic.Add( key, value);
}
}
Run Code Online (Sandbox Code Playgroud)
如果键不存在,为什么Dictionary不会自动添加键值对,如STL的映射?
现在有趣的是,在以前的生活中,我常常生气,因为我经常不得不试图阻止地图这样做.我想我现在的用例有点不同.