c# - 如何使用 NUnit 确保 Debug.Assert 正确触发

标签 c# c#-4.0 nunit

我一直在努力解决这个问题: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/

相关文章:

c# - SSDT 项目 + 集成/端到端测试 + TearDown

c# - 使用 LINQ 返回产品价格,在函数中使用什么返回类型?

c# - 如何在不使调用链异步的情况下调用 ApplicationTokenProvider?

c# - |= 运算符在 C# 中有什么作用?

linq - 有没有办法从某种类型的列表中创建属性值列表?

c# - NSubstitute - TestFixture 1 在 TestFixture 2 中导致 AmbiguousArgumentsException

c# - 无法在单元测试中复制 'cross-thread operation not valid' 错误 - 我不明白

c# - 有没有办法按照以下格式拆分列表 : 'string1' , 'string2' , 'string3' ,

c# - 如何在 .net 中获取可用的 wifi AP 及其信号强度?

c# - 获取通用列表项的计数