2012-02-13 2 views
0

У меня есть приложение Mac, NSStatusItem действительно, в котором я пытаюсь проверить его окно настроек. Я использовал этот код в качестве модели, так как он очень похож на мой код, за исключением того, что мое окно инициализируется и отображается в функции, отличной от applicationDidFinishLaunching. http://bit.ly/wH6QOkMocking NSWindowController

Я получаю ошибку: Прогнозный метод не вызывается: окно

Я не могу понять, почему это происходит. Вот мой тестовый код:

-(void)testPreferencesInit {  
    mockWindowController = [OCMockObject mockForClass:[NSWindowController class]]; 
    id mockWindow = [OCMockObject mockForClass:[NSWindow class]]; 

    [[[mockWindowController expect] andReturn:mockWindow] window]; 
    [[mockWindow expect] makeKeyAndOrderFront:weathervane]; 

    [weathervane showPreferences:nil]; 

    [mockWindowController verify]; 
    [mockWindow verify]; 

    id windowController; 
    object_getInstanceVariable(weathervane, "windowController", (void **)&windowController); 
    GHAssertEqualObjects(windowController, mockWindowController, 
           @"windowController not set on appDelegate"); 
    GHAssertTrue([[windowController windowNibName] isEqualToString:@"Preferences"], @"Window Controller nib name not set"); 

    object_setInstanceVariable(weathervane, "windowController", nil); 
    mockWindowController = nil; 
} 
+0

Вы можете оставить' реализацию showPreferences'? –

+0

Здесь: '- (IBAction) showPreferences: (id) sender { [[windowController window] makeKeyAndOrderFront: self]; } ' – Lazloman

ответ

0

Это не ясно из вашего кода, как вы ожидаете windowController, чтобы указать на mockWindowController. Внесли ли вы инициализатор категории и код invokeSupersequent, как в сообщении Мэтта Галлахера?

Из вашего кода видно, что windowController является собственностью вашего класса флюгеров. Я думаю, что самый простой подход должен был бы отказаться от пытается переопределить NSWindowController «s инициализацию и просто передать свой макет в контроллер:

-(void)testPreferencesInit {  
    mockWindowController = [OCMockObject mockForClass:[NSWindowController class]]; 
    id mockWindow = [OCMockObject mockForClass:[NSWindow class]]; 

    [[[mockWindowController expect] andReturn:mockWindow] window]; 
    [[mockWindow expect] makeKeyAndOrderFront:weathervane]; 

    weathervane.windowController = mockWindowController; 

    [weathervane showPreferences:nil]; 

    [mockWindowController verify]; 
    [mockWindow verify]; 
} 
+0

Да, я сделал. Единственное различие между его и моим кодом (AFAICT) заключается в том, что его код вызывает applicationDidFinishLaunching, тогда как мои вызовы showPreferences. – Lazloman

+0

Ну, вы можете пройти через код в отладчике и узнать, где он разваливается. Но это очень сложное решение, в которое вы, вероятно, погрузите много времени. Я думаю, что гораздо проще просто вводить макет контроллера окна во время тестирования. –

Смежные вопросы