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