如何单元测试NSArrayController(子类)?

时间:2014-08-14 16:03:17

标签: objective-c cocoa core-data nsarraycontroller xctest

我想为NSArrayController子类编写一些单元测试 我首先设置了一个Core Data托管对象上下文,然后将一些实体“Asset”对象添加到核心数据中,然后设置我的阵列控制器:

@interface MYAssetArrayControllerTest : XCTestCase
...

- (void)setUp
{
    [super setUp];
    [self setUpManagedObjectContext];
    [self setUpAssets];
    [self setUpMYAssetArrayController];
}

- (void)setUpMYAssetArrayController
{
    _arrayController = [[MYAssetArrayController alloc] init];
    [_arrayController setManagedObjectContext:_moc];
    [_arrayController setEntityName:@"Asset"];
    [_arrayController setSelectsInsertedObjects:YES];
    [_arrayController setAutomaticallyPreparesContent:YES];
    [_arrayController fetch: self];
}

当我尝试查看排列的对象时,没有:

- (void)testGetArrangedObjects
{
    id myArrangedObjects;
    myArrangedObjects = [_arrayController arrangedObjects];
    ...
}

myArrangedObjects总是空的...
我如何设置我的NSArrayController以便能够从中检索对象?

1 个答案:

答案 0 :(得分:1)

当我不向我的阵列控制器发送fetch:但是fetchWithRequest:merge:error:时,我发现它有效。我的原始代码:

- (void)setUpMYAssetArrayController
{
    _arrayController = [[MYAssetArrayController alloc] init];
    [_arrayController setManagedObjectContext:_moc];
    [_arrayController setEntityName:@"Asset"];
    [_arrayController setSelectsInsertedObjects:YES];
    [_arrayController setAutomaticallyPreparesContent:YES];
    [_arrayController fetch: self];
}

变为:

- (void)setUpMYAssetArrayController
{
    _arrayController = [[MYAssetArrayController alloc] init];
    [_arrayController setManagedObjectContext:_moc];
    [_arrayController setEntityName:@"Asset"];
    [_arrayController setSelectsInsertedObjects:YES];
    [_arrayController setAutomaticallyPreparesContent:YES];
    NSError *error = nil;
    BOOL ok = [_arrayController fetchWithRequest:nil merge:NO error:&error];
}

或许-fetch的以下评论可能是一个解释?

  

从OS X v10.4开始,此方法的结果将推迟到   runloop的下一次迭代,以便出现错误   机制可以作为一张表提供反馈。