代码之家  ›  专栏  ›  技术社区  ›  Aleksander

单元测试之间捆绑的xcode还原文件

  •  0
  • Aleksander  · 技术社区  · 6 年前

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

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

    尽管我怀疑这样做不会改变或重置底层包的状态。

    最好的方法是什么?总之,我需要一种方法,允许我将一个伪文件“注入”到我的类中,该类从包中读取它。我想在一些测试中删除这个文件,但是在每个单独的测试之后要完全重置状态。

    0 回复  |  直到 6 年前
        1
  •  0
  •   Jon Reid    6 年前

    测试应该被隔离,以便您可以单独运行它们,或者以任何顺序运行它们。如果一个测试真的删除了一些东西,你就必须把它放回去。

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

    要注入测试可以控制的假nsfilemanager版本,我建议使用ocmock i to或ocmock。