Тестирование NSWidowController с использованием OCMock - PullRequest
1 голос
/ 11 апреля 2011

Я пытался найти способ модульного тестирования моего делегата applicationDidFinishLaunching с использованием OCMock. Мой NSWindowController создается здесь, и я хотел бы проверить его. Вот мой тестовый код:

id mockWindowController = [OCMockObject niceMockForClass:[URLTimerWindowController class]];
[[mockWindowController expect] showWindow:self];
NSUInteger preRetainCount = [mockWindowController retainCount];

[appDelegate applicationDidFinishLaunching:nil];

[mockWindowController verify];

Когда я запускаю тест, я получаю сообщение об ошибке:

"OCMockObject [URLTimerWindowController]: ожидаемый метод не был вызван: showWindow: - [URLTimerAppDelegateTests testApplicationDidFinishLaunching]"

Журнал дает более подробную информацию:

"Test Case '-[URLTimerAppDelegateTests testApplicationDidFinishLaunching]' started.
2011-04-11 08:36:57.558 otest-x86_64[3868:903] -[URLTimerWindowController loadWindow]: failed to load window nib file 'TimerWindow'.
Unknown.m:0: error: -[URLTimerAppDelegateTests testApplicationDidFinishLaunching] : OCMockObject[URLTimerWindowController]: expected method was not invoked: showWindow:-[URLTimerAppDelegateTests testApplicationDidFinishLaunching]
Test Case '-[URLTimerAppDelegateTests testApplicationDidFinishLaunching]' failed (0.005 seconds).
"

Итак, я вижу, что NIB не загружается. Итак, как мне заставить его загружаться во время модульного тестирования или каким-то образом высмеивать его загрузку? Я уже посмотрел на документы OCMock, советы Криса Хэнсона по модульному тестированию и некоторые другие ресурсы, включая исходный код WhereIsMyMac, который ведет себя аналогичным образом. Мое приложение для создания экземпляра контроллера окна выглядит так:

self.urlTimerWindowController = [[URLTimerWindowController alloc] init];
[self.urlTimerWindowController showWindow:self];

Любые советы с благодарностью.

1 Ответ

1 голос
/ 12 апреля 2011

Проблема с вашим тестом заключается в том, что mockWindowController и urlTimerWindowController не являются одним и тем же объектом. И self в вашем тесте не совпадает с self в тестируемом классе. Не имеет значения, что в этом случае перо не загружается.

Обычно вы не можете смоделировать объект, когда он создается внутри метода, который вы хотите проверить. Одна альтернатива - создать объект в одном методе, а затем передать его другому методу, который завершает настройку. Затем вы можете проверить метод настройки. Например:

-(void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.urlTimerWindowController = [[URLTimerWindowController alloc] init];
    [self setUpTimerWindow:urlTimerWindowController];
}

-(void)setUpTimerWindow:(URLTimerWindowController *)controller {
    [controller showWindow:self];
}

Тогда вы бы протестировали setUpTimerWindow::

-(void)testSetUpTimerWindowShouldShowWindow {
    URLTimerAppDelegate *appDelegate = [[URLTimerAppDelegate alloc] init];

    id mockWindowController = [OCMockObject niceMockForClass:[URLTimerWindowController class]];
    [[mockWindowController expect] showWindow:appDelegate]; // this seems weird. does showWindow really take the app delegate as a parameter?

    [appDelegate setUpTimerWindow:mockWindowController];

    [mockWindowController verify];
    [appDelegate release];
}
...