NUnit:在断言失败时执行代码

时间:2010-06-23 15:53:18

标签: nunit

NUnit中是否有钩子只在断言失败而没有捕获异常时才执行代码。基本上,它应该接受在断言失败时执行的动作委托,然后重新抛出异常。我为什么需要这个? 我需要比较两个对象并将结果转储到屏幕上,以便在断言失败时更容易调试。

这样的东西有效,但是是一个糟糕的黑客,问题是它急切地评估ProcessCompareError,所以我有不必要的开销,而且无论是否有错误都会这样做。那么,是否存在重载将接受在断言失败时将执行的委托?

Assert.That(benefitLimitComparer.Compare(copyBenefitLimit, origBenefitLimit), Is.EqualTo(0),limitError, ProcessCompareError(origBenefitLimit, copyBenefitLimit));
                }
            }
        }

        private string ProcessCompareError(BenefitLimit origBenefitLimit, BenefitLimit copyBenefitLimit)
        {        
            Console.WriteLine("Original: ");
            ObjectDumper.Write(origBenefitLimit);
            Console.WriteLine("Copy");
            ObjectDumper.Write(copyBenefitLimit);

            return "";
        }

2 个答案:

答案 0 :(得分:0)

我不确定如何通过委托来完成。另一种方法是存储Compare的结果。如果结果为false,则写出对象的内容,然后调用Assert.Fail()

答案 1 :(得分:0)

将一个断言包装为 try-catch 中的 Action 是可能的。在 catch 中,您可以处理额外的比较:

    public static void ExecuteAssert(Action assert)
    {
        if (assert == null) return;
        try
        {
            assert();
        }
        catch (Exception ex)
        {
            // perform the compare
        }
    }
  

备注:如果某些非致命检查失败,我会使用类似的方法继续执行测试并避免整个测试停止。实际上我会迭代一些行动:

     

private static void VerifyAll(params Action[] asserts)