在单元测试之间捆绑在一起的Xcode恢复文件

时间:2019-02-24 05:10:08

标签: unit-testing xctest

我正在为需要存储在捆绑软件中的属性列表的类编写一系列单元测试。我将这个属性列表的模拟版本保存在我的单元测试目标中,并将单元测试包注入到该类中,以便可以读取它。我的单元测试之一是处理无法找到文件的情况,因此我只需从捆绑包中删除它,就像这样:

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

但是,这会导致问题,因为即使在两次测试之间,现在也从捆绑软件中删除了文件。如果我正确设置了测试,这可能不是问题,但是随机执行顺序是一个问题。

我确实“重新创建”了单元测试之间的捆绑包:

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

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

尽管我怀疑底层捆绑软件不会通过此操作更改或重置状态。

实现此目标的最佳方法是什么?总而言之,我需要一种允许我将假文件“注入”到我的类中的方法,该类从捆绑文件中读取该文件。我想在某些测试中删除此文件,但要在每次单独测试后将其状态完全重置。

1 个答案:

答案 0 :(得分:0)

应该隔离测试,以便您可以单独或以任何顺序运行它们。如果测试实际上删除了某些内容,则必须将其放回去。

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

要注入测试可以控制的伪造版NSFileManager,建议使用OCMockito或OCMock。