ExceptionAsserts和调试C#项目在VS
-
21-09-2019 - |
题
我们一直在用关&visual studio写。净码有一段时间了。测试的例外情况是在风格的
古老的语法:
[Test]
[ExpectException(typeof(ExceptionType))]
public void TestExceptionType()
{
}
现在呢已经发布版本,其中介绍了2.5.2 Assert.Throws( Type expectedExceptionType, TestDelegate code );
这使得异常检测一个整体的更多的灵活性。我们异常的试验,现在看起来是这样的:
新的语法:
[Test]
public void TestWithNullBufferArgument()
{
ArgumentNullException ex = Assert.Throws<ArgumentNullException>(() => _testInstance.TestFunction(null));
// now you can examine the exception and it's properties
Assert.AreEqual(ex.Message, "Argument was null");
}
我们的问题是,如果断言。抛出用Visual Studio将咳嗽了一个窗口,显示未经处理的异常的时候呢(或是控制台或GUI亚军)用于调试的程序。
澄清这一点: 我们已经设置VS项目含有单元的测试,以运行nunit-x86.exe 在调试。(见项目的性质,调试卡,启动行动是设置运行nunit-x86.exe)
这将停止关的持续测试。它能够继续调试/单元的测试按F5但是,这不是一个可行的解决方案。
是否有任何方法来避免这种情况?把试着抓住框周围的断言。抛出什么也不做,由于异常情况发生在委托代码。
我希望有人能阐明这一点。
解决方案
问题本身的出现,因为最有可能你已经选择使只是我的代码通(工具->的选择->调试事使只是我的代码)。
"当此功能启用,调试器显示和进入用户代码("我的代码"),忽略了系统的代码和其他的代码优化或没有调试的符号"(见"大、调试、选择对话框")
通常你有一个版本nunit.framework.dll 它不具有相应的呢?框架。pdb文件。
因此,有2个选择:
禁止"只是我的代码"功能
下载来源的关(从 http://www.nunit.org/index.php?p=download),建立他们在调试模式,把所有呢?框架。* (dll,pdb,xml)成lib或其他目录在您的解决方案,并参考,nunit.framework.dll 在你的试验项目。
希望这会有所帮助。
其他提示
同样的问题也让我生气相当长的一段时间,我做了一些测试和找到如下:
如果库(呢在这种情况下)编制与调试的信息设定为"无",然后,如果建造类似于一个下面是执行的内的图书馆和代表的代码扔出一个例外,那么VS停止抱怨不例外处理的用户代码。
图书馆的代码:
public static Exception Throws(TestDelegate code, string message)
{
Exception caughtException = null;
try
{
code();
}
catch (Exception ex)
{
caughtException = ex;
}
return caughtException;
}
客户代码:
private void btnTest_Click(object sender, EventArgs e)
{
var ex = MyAssert.Throws(() => { throw new Exception(); }, "");
}
设置调试的信息库项目的任何其他选项,比"无"可解决的问题,即调试器不会停止了在那些有点儿"未经处理的"例外情况。我测试了有关我自己的手卷库,与上述代码(采取了一段从关的投掷方法)。我想这是一个特征或"功能"VS。
它让我们没有那么多的选择:
滤波器异常作为先前建议
重新编译nunit.framework.dll 用于当地使用,以避免那些烦人停止
其它选项的可能联系,无论是MS或关的团队或两者并要求它们调查/澄清问题,并编制有关最低水平的调试信息respectevily.
编辑:
发现多了一个选项。
- 在我的情况下取消'抑制JIT优化模块载',也没有诀窍,即使库的汇编没有"调试"的信息。然而它仅适当的项目是运行中释放的配置。
我认为你是被蒙蔽的关的断言。你可以实现同样的事情有一个简单的试/赶上。
try
{
_testInstance.TestFunction(null);
Assert.Fail("The method should have thrown...");
}catch{}
现在,你有你需要的一切。如果你失败的例外是不是抛和你经常的代码可以处理的例外情况,如预期的那样。
可能它是可以实现通过禁止的例外。开调试/例外情况的菜单,并搜索你的例外。