代码之家  ›  专栏  ›  技术社区  ›  Dan Bryant

防止捕捉NUnit断言异常?

  •  1
  • Dan Bryant  · 技术社区  · 15 年前

    我现在正在做一个项目,需要与包含异常的代码进行交互操作。特别是,我正在编写NUnit单元测试。在某些地方,我希望在作为委托传递的代码中嵌入断言,作为模拟特定行为的一部分。我遇到的问题是,AssertionException被调用委托的代码吞没了,这意味着测试通过了,即使测试Assert失败了。

    有没有什么方法可以告诉NUnit测试应该失败,而不能通过捕获AssertionException来规避?我不能修改包含异常的代码,因为我没有完全所有权,而且它已经在半生产环境中使用了。我希望有一个干净的方法来实现这一点。

        private static string _assertionFailure;
        public static void AssertWrapper(Action action)
        {
            try
            {
                action();
            }
            catch (AssertionException ex)
            {
                _assertionFailure = ex.Message;
                throw;
            }
        }
    
        [Test]
        [ExpectedException(typeof(AssertionException))]
        public void TestDefeatSwallowing()
        {
            Action failure = () => AssertWrapper(() => Assert.Fail("This is a failure"));
    
            EvilSwallowingMethod(failure);
    
            if (_assertionFailure != null)
                Assert.Fail(_assertionFailure);
        }
    
        private void EvilSwallowingMethod(Action action)
        {
            try
            {
                action();
            }
            catch
            {
            }
        }
    

    它很管用,但很难看。我必须包装每个断言调用,并且必须在每个测试结束时检查断言是否被吞没。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Matt Mills    15 年前

    所以你要这样做?(这是使用Moq语法)

    var dependency1 = new Mock<IDependency1>();
    dependency1.Setup(d => d.CalledMethod([Args])
        .Callback(TestOutArgsAndPossiblyThrow);
    
    var objectUnderTest = new TestedObject(dependency1.Object);
    objectUnderTest.MethodThatCallsIDependency1dotCalledMethod();
    

    而且你有 TestOutArgsAndPossiblyThrow 封装在您的 AssertWrapper 上课?

    如果不是那样的话,我会说你做得差不多。您可以在某个点重新进入测试,在该点上可以记录对依赖项的调用的状态。无论是通过捕获异常并分析它们,还是直接检查方法参数的值,您都必须完成这项工作。如果你在黑盒子里吞下异常,你必须在它们回到黑盒子之前监视它们。

    我仍然认为,使用适当的日志记录和通知(不必通知最终用户)会更好。为了@TrueWill的观点-什么 当有一个 IOException 或者数据库不可用?

    讨论编辑

    TEST -> TESTED CODE -> SWALLOWING CODE -> THROWING MOCK
    
    推荐文章