Для игры, которую я разрабатываю, у меня есть несколько классов моделей, которые вызывают уведомления, когда их состояние изменяется. Затем представление подписывается на эти уведомления и может реагировать на них.
Я делаю свои модульные тесты для модели с помощью 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 или добавлю новый unit test), все начнет работать как ожидалось.
Я предполагаю, что это должно быть связано с проблемой синхронизации или NSNotificationCenter в некоторой степени полагаться на цикл выполнения.
Есть ли какие-либо рекомендации по его тестированию? Я знаю, что я мог бы добавить сеттер в Board и ввести собственный NSNotificationCenter, но я ищу более быстрый способ сделать это (возможно, какой-то трюк о том, как заменить NSNotificationCenter динамически).