单元测试核心数据 - 用代码134异常退出 [英] Unit Testing Core Data - exited abnormally with code 134

查看:141
本文介绍了单元测试核心数据 - 用代码134异常退出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为核心数据应用设置单元测试。我在一个很简单的测试遇到一个奇怪的问题。我得到的错误是:

  /Developer/Tools/RunPlatformUnitTests.include:451:0测试台/平台/ iPhoneSimulator.platform / Developer / SDKs / iPhoneSimulator4.0.sdk / Developer / usr / bin / otest'退出异常与代码134(它可能已崩溃)。 

我的单元测试的标题是:

  #import< SenTestingKit / SenTestingKit.h> 
#import< UIKit / UIKit.h>
#import< CoreData / CoreData.h>
#importUnit.h

@interface UnitLogicTests:SenTestCase {
NSManagedObjectContext * managedObjectContext;
NSPersistentStoreCoordinator * persistentStoreCoordinator;
NSManagedObjectModel * managedObjectModel;
NSPersistentStore * persistentStore;
}
@end

实现是:

  #importUnitLogicTests.h

@implementation UnitLogicTests

#pragma mark安装和拆卸
- (void)setUp {
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
NSLog(@model:%@,managedObjectModel);
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
persistentStore = [persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType
configuration:nil
URL:nil
options:nil
error:NULL];
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator:persistentStoreCoordinator];
}

- (void)tearDown
{
[managedObjectContext release];
managedObjectContext = nil;
NSError * error = nil;
STAssertTrue([persistentStoreCoordinator removePersistentStore:persistentStore error:& error],
@无法删除持久存储:%@,错误);
persistentStore = nil;
[persistentStoreCoordinator release];
persistentStoreCoordinator = nil;
[managedObjectModel release];
managedObjectModel = nil;
}

#pragma mark -
#pragma mark测试用例
- (void)testThatEnvironmentWorks
{
STAssertNotNil(persistentStore,@无持久存储);
}


- (void)testNewUnitDefaults {
Unit * newUnit = [NSEntityDescription insertNewObjectForEntityForName:@Unit
inManagedObjectContext:managedObjectContext];
STAssertEquals(newUnit.floorNumber,1,@新单位楼层号的默认值应为1);

}

@end

省略 - (void)testNewUnitDefaults 测试,然后构建完成没有错误,所以在最后一个测试中的东西被抛出一个循环。

解决方案

/ div>

在您的测试用例附近放置一个@try .... catch块。



我想加载模型

  [NSManagedObjectModel mergedModelFromBundles:nil] 

没有按预期工作



使用您的代码初始化核心数据堆栈我有一个异常

  + entityForName:在此模型中找不到名为Unit的实体。 

将模型初始化更改为以下代码:

  //根据你的modeltest中的标识符设置Info.plist 

NSString * path = [[NSBundle bundleWithIdentifier:@com.yourcompany。 ModelTest]
pathForResource:@CoreDataUnitTest_DataModel
ofType:@mom];
NSURL * modelURL = [NSURL URLWithString:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

单元测试OCUnit有时是有点棘手,因为只有很少的错误信息被暴露。


I am setting up unit testing for my core data app. I'm running into a strange problem in a pretty simple test. The error I'm getting is:

/Developer/Tools/RunPlatformUnitTests.include:451:0 Test rig '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk/Developer/usr/bin/otest' exited abnormally with code 134 (it may have crashed).

The header for my unit tests is:

#import <SenTestingKit/SenTestingKit.h>
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
#import "Unit.h"

@interface UnitLogicTests : SenTestCase {
    NSManagedObjectContext *managedObjectContext;
    NSPersistentStoreCoordinator *persistentStoreCoordinator;
    NSManagedObjectModel *managedObjectModel;
    NSPersistentStore *persistentStore;
}
@end

The implementation is:

#import "UnitLogicTests.h"

@implementation UnitLogicTests

#pragma mark Setup and Teardown
- (void)setUp {
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles: nil] retain];
    NSLog(@"model: %@", managedObjectModel);
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
    persistentStore = [persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType
                                                               configuration:nil
                                                                         URL:nil
                                                                     options:nil 
                                                                       error:NULL];
    managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator:persistentStoreCoordinator];
}

- (void)tearDown
{
    [managedObjectContext release];
    managedObjectContext = nil;
    NSError *error = nil;
    STAssertTrue([persistentStoreCoordinator removePersistentStore:persistentStore error:&error], 
                 @"couldn't remove persistent store: %@", error);
    persistentStore = nil;
    [persistentStoreCoordinator release];
    persistentStoreCoordinator = nil;
    [managedObjectModel release];
    managedObjectModel = nil;
}

#pragma mark -
#pragma mark Test Cases
- (void)testThatEnvironmentWorks
{
    STAssertNotNil(persistentStore, @"no persistent store");
}


- (void)testNewUnitDefaults {
    Unit *newUnit = [NSEntityDescription insertNewObjectForEntityForName:@"Unit" 
                                                  inManagedObjectContext:managedObjectContext];
    STAssertEquals(newUnit.floorNumber, 1, @"Default value for new Unit's floor number should be 1");

}

@end

If I omit the - (void)testNewUnitDefaults test, then the build completes without errors, so something in that last test is throwing it for a loop. I am new to this, so any assistance would be greatly appreciated!

Thanks.

解决方案

put a @try .... catch block around your testcase.

I think loading the model with

[NSManagedObjectModel mergedModelFromBundles: nil]

did not work as expected

Using your code for initialization of the core data stack I got an exception

+entityForName: could not locate an entity named 'Unit' in this model.

Changing the model initialization to the following code works fine:

    // set according to the identifier in your modeltest Info.plist

    NSString* path = [[NSBundle bundleWithIdentifier:@"com.yourcompany.ModelTest"] 
                                     pathForResource:@"CoreDataUnitTest_DataModel" 
                                              ofType:@"mom"];
    NSURL* modelURL = [NSURL URLWithString:path];
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

Unit Tests with OCUnit sometimes are a bit tricky as only little information on errors is exposed.

这篇关于单元测试核心数据 - 用代码134异常退出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆