Rob*_*nik 31 iphone file-io integration-testing unit-testing objective-c
简短的问题是:如何从命令行单元测试中使iPhone(objective-c)文件操作正常工作?
长问题,有解释:这最终将成为一个脚本,通过Hudson实例为我的iPhone构建执行自动构建/测试.关于makdad关于这个 SO问题的链接,我可以成功地从命令行(半)运行单元测试.
但是,我的一个测试失败了.测试将调用Caching Service类来保存文件,然后尝试检索它.但是,从命令行运行测试时,文件I/O似乎不起作用:(.
对于参考,通过Xcode GUI运行单元测试不会导致此类错误.
我正在使用NSFileHandle方法调用来获取写入句柄.如果它们返回nil,则使用创建文件
[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
Run Code Online (Sandbox Code Playgroud)
我认为这可能与模拟器缓存目录路径中的空格有关.我在正确的轨道上吗?如果是的话,我该怎么纠正这个?
另请注意,模拟器需要不运行才能使其正常工作,模拟器以编程方式启动并且不显示GUI.如果它正在运行,则命令行构建失败.
首先: “模拟器需要尚未运行才能正常工作”
我在终端中运行了测试,模拟器是否打开并不重要。
也许您需要查看的一些构建设置是:TEST_HOST和BUNDLE_LOADER。我在 xcodeproj 中将它们留空。
注意:我还使用 Hudson 以及测试报告和代码覆盖率。
第二:
我在使用加载路径测试终端和应用程序时遇到了失败。这与从资源加载的核心数据模型有关。
解决方案是从 url 而不是路径加载文件:
[[NSBundle bundleForClass:[self class]] URLForResource:....];
Run Code Online (Sandbox Code Playgroud)
我无法确保这与您在使用 NSFileManager 时遇到的问题相同,但我只能想象 NSBundle 使用 NSFileManager。(所以这可以是相关的)
第三:
不要让你的测试依赖于 I/O。
我发现这不是单元测试的目的。此类测试可能不依赖于文件系统、数据库、网络连接等。
创建一个在运行测试时模拟的文件系统抽象类。
这样,您的实现仅在一处依赖于实际文件系统,您可以在测试期间替换该文件系统。
您只需要一个测试来检查该抽象。
概括
希望这有帮助。