您能否 运行 仅在另一个 XCTest 完成后才进行 XCTest(如果可以,是否可以以先前的测试通过为条件)?

Can you run an XCTest only after another has completed (and if so, can it be conditional on the prior test passing)?

例如,我不想 运行 从我的本地数据中测试 select 的功能,直到使用 icloud 数据填充本地数据的测试成功为止.

我认为一个合适的单元测试应该在测试本地数据之前写一些预定义的本地数据selection 方法(人们同意吗?)。但是,对 iCloud 的调用是异步的,因此可能 return 在另一个测试中途进行,所以它仍然需要延迟到它们完成。

单元测试应该是原子的和独立的,所以通常不推荐这种方法。 XCTest 默认也不支持这个。在这个 Whosebug post 中有一个关于按您想要的顺序将 Objective-C 中的 +testInvocations 覆盖到 return NSInvocation 对象的讨论。

这里有几个选项需要考虑。一种是在 setUp 中执行初始测试配置。在所有测试用例 运行 可以进入 class 级别 setUp 方法之前将执行一次全局设置。如果您想在每个测试 运行 之前执行设置,那么您可以创建一个实例级别 setUp 方法。 (还有匹配的 tearDown 方法在测试具有 运行 之后执行)。 XCTest 文档有更多详细信息 here. Note that you'll need to use the semaphore pattern described in this 以确保所有异步调用在 运行 测试之前完成。

我认为处理此问题的最直接方法是使用 expectationWithDescription class 在同一单元测试中包含 iCloud 调用。简而言之,您将执行以下四个步骤:

  1. 实例化一个新的期望,它会在异步逻辑完成时发出信号。
  2. 执行异步操作(即从 iCloud 填充数据)。在此操作的回调中,您可以包含更多逻辑和断言。
  3. 在回调的方法结束时(通常),您可以 fulfill() 期望值。这将表明期望已经达到。
  4. 在异步块之后,调用 waitForExpectationsWithTimeout() 方法。您将在超时期限内调用此方法;如果在此期间没有达到预期,可以通过测试失败,日志输出等

Whosebug post 中还提供了涵盖异步调用的期望代码示例。