单元测试、STAssertThrows 和 NSExceptions

Posted

技术标签:

【中文标题】单元测试、STAssertThrows 和 NSExceptions【英文标题】:Unit Tests, STAssertThrows and NSExceptions 【发布时间】:2013-02-21 07:58:35 【问题描述】:

我是单元测试的新手,对此我有疑问。

在我的源代码中,我对NSMutableArray 进行了子类化。 NSMutableArray 必须已经实现了基本的 NSMutableArrayNSArray 方法。这些方法在某些情况下会抛出NSExceptions,如NSRangeExceptions

问题是:“当我对这个原始方法进行单元测试时,我应该为NSExceptions 编写案例吗?

例子:

//array with 3 objects
STAssertThrows([array insertObject:object atIndex:8], @"");
    这是正确的吗? 这有必要吗?

【问题讨论】:

【参考方案1】:

有两种情况需要考虑:断言会抛出异常,断言不会抛出异常。

后者不是必需的,但仍然是一个好主意。这是一个在断言消息中提供更明确描述您期望发生或不发生的事情的机会。但是,您可以跳过STAssertNoThrow,异常仍然会通过测试。

如果您希望发生异常,那么您需要断言,就像您在问题中的代码中所做的那样。不过,您应该提供有意义的断言消息,而不是空字符串。

【讨论】:

谢谢。我不想在我的代码中出现这个异常 (NSExceptionRange)。这是程序员错误,所以,当它发生时,应用程序将崩溃。所以这是insertObject 方法的正常行为。当索引超出范围时,则崩溃。所以问题是:(1)单元测试中的这种情况是否必要? (2) STAssertThrows 是否应该仅在必须捕获异常然后对其进行处理时才使用? @TomaszSzulc: (1) 是的,值得测试您的方法处理废话,例如超出范围的输入,以及它们处理有效输入。 (2) 当特定异常是表达式的正确结果时,您应该使用STAssertThrows。该函数将捕获异常并为您失败测试;除此之外,您无需执行任何操作。

以上是关于单元测试、STAssertThrows 和 NSExceptions的主要内容,如果未能解决你的问题,请参考以下文章

Nmap脚本引擎NSE

教程篇(7.2) 01. 简介及初始配置 & FortiGate安全 ❀ Fortinet 网络安全专家 NSE 4

考题篇(7.0) 13 ❀ FortiGate防火墙 ❀ Fortinet 网络安全专家 NSE 4

如何在 XCTestCase 中禁用“所有异常”

编写自己的Nmap(NSE)脚本

在 R 中的函数中创建和使用新变量:tidyverse 中的 NSE 编程错误