Я хочу написать несколько модульных тестов для своего подкласса 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, чтобы иметь возможность извлекать из него объекты?

2
MartinW 14 Авг 2014 в 20:03

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, результат этого метода откладывается до следующей итерации цикла выполнения, чтобы механизм представления ошибок мог предоставить обратную связь в виде листа.

1
MartinW 14 Май 2017 в 17:56