c# - 使用 Nunit 测试异常

标签 c# unit-testing exception nunit

我使用 Nunit 进行单元测试,我需要对抛出异常的代码进行单元测试。我的代码与此类似。

    public class Myclass
    {
        public int Count
        {
            get; set;
        }
        public void Foo()
        {
            try
            {
                if (Count >3)
                {
                    throw new Exception();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
    }

   [TestFixture]
  public class TestMyClass
  {
    [Test]
    public void TestFoo()
    {
        var obj = new Myclass();
        obj.Count = 4;
        Assert.Throws<Exception>(obj.Foo);
    }
 }

这会出现这样的错误

  Expected: <System.Exception>
  But was:  null

我发现,如果删除 try catch block ,单元测试就会通过。但我不想更改实际代码。请告知如何对上述代码进行单元测试以及正确的方法是什么。

最佳答案

Lee's answer是正确的,但我想扩展您通过实现它所获得的 yield 。

您的设计很好,但不适合测试。问题是双重的:

  1. 您将类依赖项隐藏在静态方法调用 (MessageBox.Show) 后面
  2. 您依赖于具体实现 (MessageBox),而不是抽象

修复第二个问题将使代码可测试。您必须引入假对象,您将在单元测试中对其进行验证(正如 Lee 建议的那样)。正确解决第二个问题(即通过接口(interface)注入(inject)依赖项)也将解决第一个问题。

通过引入界面,我们做了两件事:

  1. 消息框对通用错误处理程序组件的抽象使用——我们不再依赖纯粹与gui相关的MessageBox。实际的错误处理程序仍然可能是一个消息框,但现在它也可以是自定义窗口、系统警报或日志消息。您的类(class)不需要知道它是什么,现在不需要(我们已经分离了关注点)。
  2. 引入了所述错误处理程序对测试类的依赖性 - 通过这一更改,我们已经大声而明确地声明,“为了正确运行,此类需要错误处理程序”。这对于以后使用您的代码的任何人来说都是重要的信息。

关于c# - 使用 Nunit 测试异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24384074/

相关文章:

c# - 程序如何创建然后写入文件

c# - 如何在 Entity Framework 中创建多对多映射?

c# - 如何模拟存储库以用作 Controller 的参数?

haskell - 一旦捕获异常,如何停止评估函数列表

java - 在 while 循环内重复错误消息

c# - IEnumerable<XElement> 比较不一样

c# - PreFlight 请求 404 未找到 .net web api;对预检请求的响应未通过访问控制检查 : it does not have http ok status

ruby - 使用 Ruby 将一个数组插入另一个数组,并返回方括号

java - 导入无法解决(Junit)

java.net.MalformedURLException : no protocol