代码之家  ›  专栏  ›  技术社区  ›  Kamran Bigdely

生产代码的一般try-catch Eats导致失败测试通过的UnUnit断言异常

  •  0
  • Kamran Bigdely  · 技术社区  · 4 年前

    我知道失败的断言语句会抛出异常,这就是测试运行程序检测错误发生的方式。我的问题是,在生产代码中有一个通用的try-catch块,它吃掉了这些Assert异常,而Unity测试运行者认为代码正在运行,没有任何问题。我已将代码简化为:

        [UnityTest]
        public IEnumerator End2EndTests_Test_Foo()
        {
    
            try
            {
                Assert.Fail("Something is wrong.");
            }
            catch (Exception)
            {
    
                UnityEngine.Debug.Log("* Something went wrong. I ate this exception! yum yum *");
            }
            
            yield break;
    
        }
    

    正如我提到的,这个测试通过了Unity test Runner。有什么补救措施?

    注1 :我没有在生产代码中放入任何断言。断言位于由生产代码调用的回调中。如果回调中发生任何异常,生产代码就会捕获它们。这就是生产代码而不是测试运行程序捕获失败断言异常的方式。

    注2 :一些背景:生产代码向服务器发送请求。当它收到响应时,它调用所有订阅者(=回调)。我的测试代码已经订阅了OnResponse事件。失败的断言在该回调中。一般的try-catch在生产代码中,包含对OnResponse事件的调用。

    注3 :我不想在生产代码中为nUnit放入一个特殊的catch语句,然后重新抛出异常。这是一个糟糕的解决方案,因为生产代码不应该依赖于测试框架。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Charlie    4 年前

    测试可以订阅回调,但不能在回调调用的方法中断言。你所能做的就是记录信息。

    安装回调后,测试本身应该等待回调完成,然后对保存的信息进行断言。