例如,我不希望运行从本地数据中选择的函数的测试,直到使用icloud数据填充本地数据的测试成功。
我认为正确的单元测试应该在测试本地数据选择方法之前编写一些预定义的本地数据(人们是否同意?)。但是,对iCloud的调用是异步的,因此可以在其他测试的中途返回,因此它仍然需要延迟,直到它们完成。
答案 0 :(得分:2)
单元测试应该是原子的和独立的,所以通常不推荐这种方法。默认情况下,XCTest也不支持此功能。在Stackoverflow post中讨论了在Objective-C中覆盖+testInvocations
以按照您喜欢的顺序返回NSInvocation
个对象。
这里有几个选项需要考虑。一种是在setUp
中执行初始测试配置。在所有测试用例运行之前执行一次的全局设置可以进入类级别setUp
方法。如果要在运行每个测试之前执行设置,则可以创建实例级setUp
方法。 (还有一些匹配的tearDown
方法在测试运行后执行)。 XCTest文档包含更多详细信息here。请注意,您需要使用此Stackoverflow post中描述的信号量模式,以确保在运行测试之前完成所有异步调用。
我认为最直接的方法是使用expectationWithDescription
类在同一单元测试中包含iCloud调用。简而言之,您将执行以下四个步骤:
fulfill()
期望。这将表明期望已经实现。waitForExpectationsWithTimeout()
方法。您将使用超时期限调用此方法;如果在此期间没有达到预期,则可能无法通过测试,记录输出等。Stackoverflow帖子中还提供了期望代码示例,其中包含异步调用。