Xcode在单元测试之间恢复捆绑包中的文件

问题描述 投票:0回答:1

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

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;
    [...]
}

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

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

unit-testing xctest
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.