如何解决单元测试找不到核心数据模型文件
| 我已经创建了一个包含Core Data模型的项目。该应用程序将查找模型文件(.momd)并正常运行。 不幸的是,单元测试一直返回null:NSURL *dataModelURL = [[NSBundle mainBundle] URLForResource:@\"myDataModel\" withExtension:@\"momd\"];
我可以在主要目标和单元测试目标的“编译源”目录中同时看到myDataModel.xdatamodeld文件夹和文件-但这似乎还不够。我在单元测试目标中还缺少什么?
谢谢,
-路德
解决方法
不幸的是,单元测试目标没有使用应用程序的主捆绑包,而是创建了一个特殊的UnitTest捆绑包。因此,如果您需要在测试中使用捆绑的资源(例如Core Data模型),则需要解决该问题。
最简单,最灵活的解决方法是在测试代码中使用
NSBundle
的bundleForClass:
方法。在测试中,该方法的参数可以简单地由ѭ3给出。这样,您可以重复使用此代码,而不必在多个项目中调整包标识符。
例:
- (void)testBundleLocation
{
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSURL *url = [bundle URLForResource:@\"myDataModel\" withExtension:@\"momd\"];
...
}
,答案与捆绑软件有关。单元测试目标不使用\'main \'捆绑包。它创建自己的捆绑包,在我的情况下,默认为\'com.yourcompany.UnitTest \'-直接从[Target] -info.plist中获取。
纠正后的解决方案如下所示:
NSBundle *bundle = [NSBundle bundleWithIdentifier:@\"com.yourcompany.UnitTests\"];
NSURL *url = [bundle URLForResource:@\"myDataModel\" withExtension:@\"momd\"];
谢谢
,遇到类似的问题,我使用OCMock框架解决了该问题,因此无需更改应用程序代码
@interface TestCase()
@property (nonatomic,strong) id bundleMock;
@end
@implementation TestCase
- (void)setUp
{
self.bundleMock = [OCMockObject mockForClass:[NSBundle class]];
[[[self.bundleMock stub] andReturn:[NSBundle bundleForClass:[self class]]] mainBundle];
[super setUp];
}
- (void)tearDown
{
[self.bundleMock stopMocking];
[super tearDown];
}
,此方法将从任何目标获取捆绑包。但是,对于添加的每个目标,您都必须手动将plist捆绑标识符添加到identifiers
数组,因为无法以编程方式获取它。好处是您可以使用相同的代码来测试或运行应用程序。
+(NSBundle*) getBundle
{
NSBundle *bundle = nil;
// try your manually set bundles
NSArray *identifiers = [NSArray arrayWithObjects: @\"com.your.application\",@\"com.your.test\",nil];
for(NSString *bundleId in identifiers) {
bundle = [NSBundle bundleWithIdentifier:bundleId];
if (bundle!=nil) break;
}
// try the main bundle
if (bundle==nil) bundle = [NSBundle mainBundle];
// abort
assert(bundle!=nil && \"Missing bundle. Check the Bundle identifier on
the plist of this target vs the identifiers array in this class.\");
return bundle;
}
,我的问题确实是错误的捆绑包!当我试图使用框架中的数据库时,我不得不从相应的ѭ9中加载数据库!
这是Swift4中使用ѭ10的一些代码:
// Load the bundle
let frameworkBundle = Bundle(for: AClassFromTheFramework.self)
let managedObjectModel = NSManagedObjectModel.mergedModel(from: [frameworkBundle])
// Use the new `managedObjectModel` by default
MagicalRecord.setShouldAutoCreateManagedObjectModel(false)
NSManagedObjectModel.mr_setDefaultManagedObjectModel(managedObjectModel)
// Load the database
MagicalRecord.setupCoreDataStack(withAutoMigratingSqliteStoreNamed: \"db.sqlite\")
和瞧!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。