2012-02-13 10 views
0

私はMacアプリケーションを持っています。私はNSStatusItemを実際に使っています。そこでは、その環境設定ウィンドウをテストしようとしています。 私のモデルは、私のウィンドウが初期化され、applicationDidFinishLaunching以外の関数で表示される点を除いて、私のコードとよく似ているので、このコードをモデルとして使用しました。 http://bit.ly/wH6QOkNSWindowControllerを募集

私はエラーを取得する: 期待メソッド呼び出されない:ウィンドウ

これがなぜ起こるか私が把握することはできません。ここに私のテストコードは次のとおりです。

-(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

それはあなたがwindowControllermockWindowControllerを指すように期待してどのようにあなたのコードからも明らかではありません。 Matt Gallagherの記事のようにカテゴリ初期化子とinvokeSupersequentコードを実装しましたか?

あなたのコードからはwindowControllerがあなたのウェザーヴァーンクラスの所有物であると思われます。私は最も簡単な方法は、NSWindowControllerの初期設定を上書きしようとして避け、ちょうどあなたのコントローラにあなたのモックを渡すことだと思う:

-(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

さて、デバッガのコードをステップ実行して、どこが崩れているのかを調べることができます。しかし、それは非常に複雑なソリューションであり、多くの時間を浪費する可能性があります。テスト時にモックウィンドウコントローラを注入する方がはるかに簡単だと思います。 –

関連する問題