【问题标题】:Xcode restore files in bundle between unit testsXcode 在单元测试之间还原文件包
【发布时间】:2019-07-17 20:06:16
【问题描述】:

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

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】:

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

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

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

    【讨论】:

    • 感谢乔恩的回答。由于我实际上无法写入包,我将不得不重写我正在测试的类以允许注入 FileManager 而不是 Bundle。非常感谢!
    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    相关资源
    最近更新 更多