Для игры, которую я разрабатываю, у меня есть несколько классов моделей, которые вызывают уведомления при изменении их состояния. Затем представление подписывается на эти уведомления и может реагировать на них.
Я делаю свои юнит-тесты для модели с OCUnit и хочу утверждать, что ожидаемые уведомления были опубликованы. Для этого я делаю что-то вроде этого:
- (void)testSomething {
[[NSNotificationCenter defaultCenter] addObserver:notifications selector:@selector(addObject:) name:kNotificationMoved object:board];
Board *board = [[Board alloc] init];
Tile *tile = [Tile newTile];
[board addTile:tile];
[board move:tile];
STAssertEquals((NSUInteger)1, [notifications count], nil);
// Assert the contents of the userInfo as well here
[board release];
}
Идея состоит в том, что NSNotificationCenter
добавит уведомления к NSMutableArray
, вызвав его метод addObject:
.
Однако, когда я запускаю его, я вижу, что addObject:
отправляется другому объекту (не моему NSMutableArray
), в результате чего OCUnit перестает работать. Однако, если я закомментирую некоторый код (например, вызовы release
или добавлю новый модульный тест), все начнет работать, как и ожидалось.
Я предполагаю, что это связано с проблемой синхронизации, или NSNotificationCenter
каким-то образом полагается на цикл выполнения.
Есть ли какие-либо рекомендации для проверки этого? Я знаю, что мог бы добавить установщик в Board
и ввести свой собственный NSNotificationCenter
, но я ищу более быстрый способ сделать это (возможно, какой-то трюк, как динамически заменить NSNotificationCenter
).