目标C中的单元测试 - >如何复制sqlite数据库

时间:2011-12-12 15:53:08

标签: objective-c ios ipad unit-testing octest

我在运行测试套件时遇到了一些麻烦。基本上我向我的应用程序添加了一个新目标,如下所示: Unit Testing Applications

由于我想测试我的DA-classes和sqlite-database,我使用以下剪辑来复制数据库:

    // First, test for existence.
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:DATABASE_Path];
success = [fileManager fileExistsAtPath:writableDBPath];
if (success) return;
// The writable database does not exist, so copy the default to the appropriate location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:DATABASE_Path];
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if (!success) {
    NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
}

但是看起来,NSBundle没有按预期返回数据库的路径。

这有一个简单的解决方法吗?我在最近几个小时内无法修复它 - 所以我的下一个镜头就是你们。

非常感谢任何帮助或建议!

非常感谢!

汤姆

1 个答案:

答案 0 :(得分:1)

我刚刚遇到完全相同的问题,继承了一些以非常类似的方式执行原始sqlite访问的代码。

这里有两个问题,他们在其他地方回答了问题。

首先,在测试NSBundle期间,mainBundle没有返回您的想法,如果您希望在单元测试期间依赖于NSBundle mainBundle的代码,则可以将其替换为

[NSBundle bundleForClass: [self class]]

我不确定这是否效率低(可能),但它确实可以在单元测试中使用。

第二个问题是文档目录没有被正确引用,因为单元测试没有在沙盒中运行。有几种方法可以解决这个问题,但最简单的方法就是在〜/ Library / Application Support / iPhone Simulator / 6.1 /中创建一个文档目录。 显然,6.1只是一个例子。

参考文献: -

OCUnit & NSBundle

NSHomeDirectory in iPhone unit test

顺便说一句,我只是喜欢回答旧问题。