生产代码的一般 try-catch 吃掉 nUnit 断言异常导致失败的测试通过
Production Code's General try-catch Eats nUnit Assertion Exceptions Causing the Failing Tests to Pass
我知道 nUnit 失败的 Assert 语句会抛出异常,这就是测试运行器检测错误发生的方式。我的问题是生产代码中有一个通用的 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语句并重新抛出异常。这是一个糟糕的解决方案,因为生产代码不应依赖于测试框架。
您的测试订阅回调是可以的,但您不能在回调调用的方法中断言。你能做的就是记录信息。
测试本身,安装回调后应该等待回调完成,然后断言保存的信息。
我知道 nUnit 失败的 Assert 语句会抛出异常,这就是测试运行器检测错误发生的方式。我的问题是生产代码中有一个通用的 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语句并重新抛出异常。这是一个糟糕的解决方案,因为生产代码不应依赖于测试框架。
您的测试订阅回调是可以的,但您不能在回调调用的方法中断言。你能做的就是记录信息。
测试本身,安装回调后应该等待回调完成,然后断言保存的信息。