单元测试无法找到Core Data模型文件

Lut*_*ker 16 iphone xcode cocoa unit-testing ocunit

我已经创建了一个带有Core Data模型的项目.应用程序查找模型文件(.momd)并运行正常.

不幸的是,单元测试不断返回null:

NSURL *dataModelURL = [[NSBundle mainBundle] URLForResource:@"myDataModel" withExtension:@"momd"];
Run Code Online (Sandbox Code Playgroud)

我可以在主目标和单元测试目标的Compile Sources目录中看到myDataModel.xdatamodeld文件夹和文件 - 但这似乎不够.我在单元测试目标中还缺少什么?

谢谢,-Luther

Til*_*ill 35

不幸的是,单元测试目标不使用应用程序的主bundle,但它会创建一个特殊的UnitTest-bundle.因此,如果您需要在测试中使用捆绑资源(如Core Data模型),则需要解决该问题.

最简单,最灵活的解决方法是使用测试代码中的bundleForClass:方法NSBundle.该方法的参数可以简单地[self class]在您的测试中给出.这样,您可以重用此代码,而无需在多个项目中调整包标识符.

例:

- (void)testBundleLocation
{
    NSBundle *bundle = [NSBundle bundleForClass:[self class]];
    NSURL *url = [bundle URLForResource:@"myDataModel" withExtension:@"momd"];
    ...
}
Run Code Online (Sandbox Code Playgroud)


Lut*_*ker 6

答案与捆绑包有关.单元测试目标不使用'main'包.它创建了自己的bundle,在我的例子中,默认为'com.yourcompany.UnitTest' - 直接来自[Target] -info.plist.

修正后的解决方案如下所示:

NSBundle *bundle = [NSBundle bundleWithIdentifier:@"com.yourcompany.UnitTests"];
NSURL *url = [bundle URLForResource:@"myDataModel" withExtension:@"momd"];
Run Code Online (Sandbox Code Playgroud)

谢谢