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