你可以在另一个完成之后运行XCTest(如果是的话,它是否可以通过先前的测试通过)?

时间:2016-11-23 11:26:08

标签: swift xcode asynchronous xctest

例如,我不希望运行从本地数据中选择的函数的测试,直到使用icloud数据填充本地数据的测试成功。

我认为正确的单元测试应该在测试本地数据选择方法之前编写一些预定义的本地数据(人们是否同意?)。但是,对iCloud的调用是异步的,因此可以在其他测试的中途返回,因此它仍然需要延迟,直到它们完成。

1 个答案:

答案 0 :(得分:2)

单元测试应该是原子的和独立的,所以通常不推荐这种方法。默认情况下,XCTest也不支持此功能。在Stackoverflow post中讨论了在Objective-C中覆盖+testInvocations以按照您喜欢的顺序返回NSInvocation个对象。

这里有几个选项需要考虑。一种是在setUp中执行初始测试配置。在所有测试用例运行之前执行一次的全局设置可以进入类级别setUp方法。如果要在运行每个测试之前执行设置,则可以创建实例级setUp方法。 (还有一些匹配的tearDown方法在测试运行后执行)。 XCTest文档包含更多详细信息here。请注意,您需要使用此Stackoverflow post中描述的信号量模式,以确保在运行测试之前完成所有异步调用。

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

  1. 实例化一个新的期望,它表示异步逻辑何时完成。
  2. 执行异步操作(即从iCloud填充数据)。在此操作的回调中,您可以包含更多逻辑和断言。
  3. 在回调方法结束时(通常),您可以fulfill()期望。这将表明期望已经实现。
  4. 在异步阻止后,调用waitForExpectationsWithTimeout()方法。您将使用超时期限调用此方法;如果在此期间没有达到预期,则可能无法通过测试,记录输出等。
  5. Stackoverflow帖子中还提供了期望代码示例,其中包含异步调用。