在Visual Studio C# Express 2010中调试Nunit测试

6
我已经按照这个建议使NUnit测试的调试工作起作用。http://www.blackwasp.co.uk/NUnitCSharpExpress.aspx。但是,我有几个测试使用了Assert.Throws<...>方法,当我测试的异常发生时,这会导致调试器中断,而我希望它在这些调用之外发生异常时才会中断。如何让调试器忽略这些方法内部引起的异常呢?

编辑: 我甚至尝试了下面的方法,但是没有用!

[Test]
public void InstanciatingWithNullParameterThrowsException()
{
    try
    {
        Assert.Throws<ArgumentNullException>(() => new CachedStreamingEnumerable<int>(null));
        // This still throws and stops be being able to debug tests called after this one
    }
    catch
    {

    }
}

2
我也想得到这个问题的答案,但是下面的回答都不是。 - Alvaro Rodriguez
4个回答

4
以下是对我有效的操作(尽管是在Visual Studio Professional中,而不是Express,但我想这应该没有关系)。
1.按照Ninjapig的建议打开“异常”对话框。 2.点击“添加...”按钮以打开“新异常”对话框。 3.在下拉框中选择“公共语言运行时异常”。 4.在编辑框中输入“NUnit.Framework.AssertionException”。 5.单击“确定”关闭“新异常”对话框。 6.回到“异常”对话框,确保两个复选框(“抛出”和“用户未处理”)都未选中。 现在,调试器应该完全忽略NUnit断言失败(即已抛出、已捕获或未捕获的NUnit.Framework.AssertionException)。
更新:这只能防止调试器中断,不能忽略异常本身;也就是说,它不会改变实际的程序流程。除了在try-catch块中更改、替换或封装Assert调用之外,我认为没有什么可以自动实现这一点。

1
那个方法不起作用,因为调试器在抛出我测试的异常时中断,而不是在断言失败时中断。在我的情况下,我得到了一个“NullReferenceException”。 - George Duckett
@George Duckett:好的,现在我有点困惑了;-) 我理解你的意思是,你不想在 NUnit 的 Assert.*() 操作失败时打断调试器;这些操作会表现为抛出 NUnit.Framework.AssertionException 异常。当然,在这种情况下,“忽略”意味着不打断调试器,程序当然会收到异常并根据异常进行处理。如果你想要做的就像那个异常从未发生过一样,我想除了一开始就不抛出它之外,你真的无能为力。 - Christian.K
抱歉,我会尽力澄清。在我的测试中,我正在检查特定的异常是否发生。当我使用我找到的方法调用nunit时,如果发生我正在寻找的那个异常,它就会中断。由于我实际上是在测试该异常的发生,所以我想忽略它,以便继续进行我真正想要调试的测试。 - George Duckett
由于某种原因,它不会在任何nunit异常上中断,在我的库被正确测试时导致ArgumentNullException时,它会在那之前中断,这就是我想要忽略的。 - George Duckett
你不能简单地“取消选中”你不想要的异常类型,以免它们发生(当然还是会发生)。我原以为这是AssertionException,但现在听起来好像是所有其他异常。 - Christian.K
这可能是我必须做的事情,但实际上我仍然希望在那些异常的其他出现中断(我只想忽略Assert.Throws调用中的异常)。 - George Duckett

0

我有同样的问题。虽然你原本的处理方式(不使用try...catch块)可以处理大多数异常类型,但无法处理 ArgumentNullException 异常。我这样修复了它:

[Test]
public void InstanciatingWithNullParameterThrowsException()
{
    bool isArgumentNullExceptionThrown = false;
    try
    {
       new CachedStreamingEnumerable<int>(null);
    }
    catch (ArgumentNullException)
    {
        isArgumentNullExceptionThrown = true;
    }
    Assert.That(isArgumentNullExceptionThrown);
}

这不是很优雅,但似乎可以工作。


0

我不确定VS2010 Express是否有这个选项,但您可以选择中断的异常。

转到“调试”菜单,然后选择“异常” 菜单选项

从这里您可以选择中断的异常 异常选择窗口


不错的想法,但我不想在特定的异常上中断,我希望如果它们是从Assert.Throws方法中抛出的,就不会中断。 - George Duckett

0

我最终引用了nunit-gui-runner.dll并像这样调用它

NUnit.Gui.AppEntry.Main(new string[] { Dll });

这会打开 NUnit 的图形用户界面。然后我就可以运行我感兴趣的特定测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接