相关疑难解决方法(0)

如何使用Assert.Throws来断言异常的类型?

如何使用Assert.Throws断言异常的类型和实际的消息措辞.

像这样的东西:

Assert.Throws<Exception>(
    ()=>user.MakeUserActive()).WithMessage("Actual exception message")
Run Code Online (Sandbox Code Playgroud)

我正在测试的方法抛出多个相同类型的消息,使用不同的消息,我需要一种方法来测试是否根据上下文抛出了正确的消息.

c# nunit exception assertions

226
推荐指数
5
解决办法
12万
查看次数

NUnit:为什么不Assert.Throws <T> Catch My ArgumentNullException?

我是在尊敬的John Skeet先生的要求下重新发布这个问题的,他建议我设计一个简单的测试程序,隔离并演示我遇到的问题并重新发布问题.这个问题多起来了这一个,所以请原谅我,如果这一切听起来很熟悉.您可以从中收集有关此问题的额外详细信息.

我遇到的问题Assert.Throws<T>来自NUnit 2.5.9.有时,它无法捕获TestDelegate调用的方法中抛出的任何异常.我已经在下面的代码中以可重现的方式确定了这种行为.(尽管如此,这可能是Fails On My Machine™的案例.

为了重现错误,我创建了一个包含两个C#DLL项目的解决方案:

  • 第一个包含一个类,只有一个公共方法.该方法是一种扩展方法,它封装了创建SqlCommand,填充其参数并ExecuteScalar在其上调用所需的逻辑.该项目不包括其他参考.
  • 第二个包含一个具有两个方法的类,用于测试第一个DLL中的方法是否按预期工作.该项目引用了第一个,并包含对NUnit Framework的引用.没有引用其他程序集.

当我在调试器中单步执行测试时,我会观察到以下内容:

  1. Assert.Throws正确调用ExecuteScalar<T>扩展方法.
  2. 正如预期的那样,参数值为null.
  3. ExecuteScalar<T> 测试其参数的空值.
  4. 调试器确实命中并执行包含的行throw new ArgumentNullException(...).
  5. 执行后throw,应用程序的控制权不会立即转移到Assert.Throws.相反,它继续在下一行ExecuteScalar<T>.
  6. 下一行代码执行后,调试器就会中断,并显示错误"用户代码未处理Argument null异常".

下面给出了隔离此行为的源代码.

扩展方法

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)

.net c# nunit exception

15
推荐指数
1
解决办法
5224
查看次数

任何人都可以解释为什么C#中的Dictionary <>不像STL中的map <T,U>那样工作?

去年我第一次开始使用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的映射?

现在有趣的是,在以前的生活中,我常常生气,因为我经常不得不试图阻止地图这样做.我想我现在的用例有点不同.

c# dictionary stl map

5
推荐指数
1
解决办法
1149
查看次数

标签 统计

c# ×3

exception ×2

nunit ×2

.net ×1

assertions ×1

dictionary ×1

map ×1

stl ×1