我一直在努力解决这个问题:How to create a unit test that tests if a function aborts because Debug.Assert (from System.Diagnostics
) fails, marking it执行此操作时为通过,否则为失败。
我知道NUnit
具有[ExpectedException(typeof( ArgumentException ) )]
功能,但我似乎无法从 MSDN 网站上找出它是哪种异常.直觉会说它可能类似于 AssertionException,而且它确实存在……但它是 NUnit 框架的一部分。我想这就是 NUnit assert 抛出的异常。我也许可以使用以下方法对其进行核打击:
[ExpectedException(typeof(Exception))]
但这会引起出现标准windows调试窗口的问题。在我的搜索中,我发现了一些方法可以完全删除此窗口,但这感觉就像把一把屠刀带到通常使用手术刀的手术台上。因为我确实希望在发生意外情况时能够看到这个窗口,当我执行我的程序时。
我想有一个解决方法是用 NUnit
对应的方法替换 Debug.Assert
方法(我的项目还处于早期阶段,所以它不是太大的重构),但我假设很多程序员都坚持使用 Debug.Assert
功能,因为它是 .NET 中的标准功能。
因此,我想知道如何“断言”Debug.Assertion
失败,而不必从我的项目中“破坏”Windows 调试屏幕?
要从我的代码中的契约(Contract)中获取具体示例,下面有一个示例。对于那些看起来很熟悉的人来说,它是作为函数编写的战锤 40K 桌面 war 游戏中的 To-Wound 表。
static public int assaultToHit(int _attacker_WeaponSkill,
int _defender_WeaponSkill)
{
//Preconditions
Debug.Assert(_attacker_WeaponSkill >= 1 && _attacker_WeaponSkill <= 10,
"Weapon Skill stat must be in range [1,10]");
Debug.Assert(_defender_WeaponSkill >= 1 && _defender_WeaponSkill <= 10,
"Weapon Skill stat must be in range [1,10]");
int target;
if (_attacker_WeaponSkill > _defender_WeaponSkill)
{
target=3;
}
else if (_defender_WeaponSkill >= (_attacker_WeaponSkill + _attacker_WeaponSkill + 1))
{
target=5;
}
else
{
target=4;
}
//postconditions
Debug.Assert(target >= 3 && target <= 5,
"To hit target for assault must be in range [3,5]");
return target;
}
测试先决条件的函数应该是这样的:
[TestCase(-1,2)]
[TestCase(1, -2)]
[TestCase(-1, -2)]
[TestCase(11, 2)]
[TestCase(1, 20)]
[TestCase(11, 20)]
[ExpectedException(typeof(Exception))]
public void testContract_AssaultToHit(int _attacker_weaponskill,
int _defender_weaponskill)
{
Warhammer40kRules.assaultToHit(_attacker_weaponskill,
_defender_weaponskill);
}
最佳答案
您似乎使用了错误的工具来控制出现错误的应用程序流程。 Debug.Assert()
不应用于驱动应用程序逻辑流。
单元测试应该涵盖一个真实的测试用例,看起来要么您正在尝试实现错误的测试用例,要么您需要抛出异常/等等,而不是使用 Debug.Assert()
。您可以共享一些代码,以便为您提供一些具体建议。
无论如何,您可以阅读 MSDN,了解如何添加自定义跟踪监听器并拦截 Assert
调用。
有用的链接:
关于c# - 如何使用 NUnit 确保 Debug.Assert 正确触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9230065/