iPhone命令行单元测试(和文件I / O)

时间:2011-09-27 06:49:44

标签: iphone objective-c unit-testing file-io integration-testing

简短的问题是:如何从命令行单元测试中使iPhone(objective-c)文件操作正常工作?

长问题,有解释:这最终将成为一个脚本,通过Hudson实例为我的iPhone构建执行自动构建/测试。关注makdad在this上的链接问题让我能够成功地从命令行(半)运行单元测试。

然而,我的一个测试失败了。测试将调用Caching Service类来保存文件,然后尝试检索它。但是,从命令行运行测试时,文件I / O似乎不起作用:(。

对于参考,通过Xcode GUI运行单元测试不会导致此类错误。

我正在使用NSFileHandle方法调用来获取写入句柄。如果它们返回nil,则使用

创建文件
[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];

我认为它可能与模拟器缓存目录路径中的空格有关。我在正确的轨道上吗?如果是的话,我该怎么纠正这个?

另请注意,模拟器需要 NOT 运行才能使其正常工作,模拟器以编程方式启动并且不显示GUI。如果它正在运行,则命令行构建失败。

1 个答案:

答案 0 :(得分:3)

首先:'模拟器需要不运行才能使其正常工作'
我在终端上运行了测试,如果模拟器打开则无关紧要。

也许您需要查看的一些构建设置是:TEST_HOSTBUNDLE_LOADER。 我把它们留在我的xcodeproj中 注意:我正在使用Hudson以及测试报告和代码覆盖率。

<强>第二
我在测试终端和带有加载路径的应用程序中遇到了故障。这与从资源加载的核心数据模型有关 解决方案是从url而不是路径加载文件:

[[NSBundle bundleForClass:[self class]] URLForResource:....];

我无法确保这与您遇到的NSFileManager相同的问题有关,但我只能想象NSBundle使用NSFileManager。 (所以这可能是相关的)

<强>第三
不要让您的测试依赖于I / O.
我发现这不是单元测试的目的。此类测试可能不依赖于文件系统,数据库,网络连接等。

创建一个在运行测试时模拟的文件系统抽象类 这样,您的实现只能在一个地方依赖于实际的文件系统,您可以在测试期间替换它。

您只需要一个测试来检查抽象。

<强>摘要

  • 第一个将改善您的测试设置。
  • 第二个希望能解决您的测试问题。
  • 第三个将减少问题的发生并改善您的代码。

希望这有用。