2010-06-23 141 views
2

在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 ""; 
     } 
+0

也许你可以写自己的'Assert'函数来代替,省去了挂钩的需要? – MEMark 2014-04-05 13:38:58

回答

0

我不知道如何通过委托来完成。一种替代方法是存储比较结果。如果结果是假的,写出来的对象的内容,然后调用Assert.Fail()

0

有包装断言如在的try-catch行动一个possibilty。在可以处理额外的比较:

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)