Xcode 在单元测试之间以捆绑方式恢复文件

Xcode restore files in bundle between unit tests

我正在为 class 编写一系列单元测试,这需要 属性 列表存储在包中。我在我的单元测试目标中保留了这个 属性 列表的模拟版本,并将单元测试包注入 class 以便可以读取。我的一个单元测试涉及处理找不到文件的情况,所以我只是像这样从包中删除它:

NSString *plistPath = [self.bundle pathForResource:kInAppPurchasesPlistName ofType:@"plist"];
[[NSFileManager defaultManager] removeItemAtPath:plistPath error:nil];

然而,这会导致问题,因为文件现在已从捆绑包中删除,即使在测试之间也是如此。如果我正确地设置了我的测试,这可能不是问题,但是对于随机执行顺序来说它是。

我"recreate"单元测试之间的捆绑:

- (void)setUp {
    [...]
    self.bundle = [NSBundle bundleForClass:[self class]];
    [...]
}

- (void)tearDown {
    [...]
    self.bundle = nil;
    [...]
}

虽然我怀疑底层包不会通过这样做来改变或重置状态。

完成此任务的最佳方法是什么?总之,我需要一种方法,允许我将 "inject" 一个假文件放入我的 class 中,然后从包中读取它。我想在某些测试中删除这个文件,但为了在每次单独测试后完全重置状态。

应隔离测试,以便您可以 运行 单独或按任何顺序进行测试。如果测试确实删除了某些内容,则您必须将其放回原处。

对文件系统进行更改的危险在于它是持久可变状态,跨测试共享。我建议不要直接与 NSFileManager 对话,而是注入它。根据您的代码,这可以通过初始化参数(首选)或 属性(次佳)来完成。您甚至可以让您的生产代码使用惰性 属性,以便它默认使用 [NSFileManager defaultManager],除非已注入不同的实例。

要注入您的测试可以控制的虚假版本的 NSFileManager,我建议使用 OCMockito 或 OCMock。