2016-05-31 5 views
0

私はiOSプロジェクトでユニットテストを行うのにOCMock 3を使用しています。OCMock 3のユニットテストで関数の戻り値をチェックする方法

OCMockはiOS用の素晴らしいユニットテストライブラリと言われていますが、上にリンクしたOCMockドキュメントでは、関数の戻り値をチェックする方法がはっきりしていません。 。 しかし、私は関数の戻り値をスタブする必要はありません、私は実際の戻り値を確認する必要があります。

は例えば、私はユニットテストに私のSchoolクラスの機能をしたい:

@implementation School 
... 
- (void) checkStudents { 
    BOOL isOnVacation = [[Coordinator sharedInstance] checkCalendar]; 
    if (!isOnVacation) { 
    takeLecture(); 
    } 
} 
@end 

私のテストケース:私は[[Coordinator sharedInstance] checkCalendar]の戻り値をスタブにしたくない

- (void) testCheckStudents { 
    // create a partially mocked 'Coordinator' instance 
    id coordinatorMock = [OCMockObject partialMockForObject:[Cooridnator sharedInstance]]; 

    // run the method under test 
    [schoolToTest checkStudents]; 

    // I want to check not only '[[Coordinator sharedInstance] checkCalendar]' is invoked, but also check its return value is YES. How to check this in OCMock? 
    OCMVerify([coordinatorMock checkCalendar]); 
} 

実際の実装を実行します。

[[Coordinator sharedInstance] checkCalendar]が呼び出されるだけでなく、戻り値がYESであることを確認したいと思います。 OCMockでこれをチェックするには?

(そのマニュアルでは、私が唯一の関数が呼び出されることを確認します。私はそのドキュメントで何かを逃してください、そこここに&をスタブ関数の戻り値を見ることができますか?)

答えて

3

[[Coordinator sharedInstance] checkCalendar]の戻り値が範囲内ではありません確認ユニットテストがSchoolの動作を検証しているため、このケースのオブジェクトを隠すことの背後にあるアイデアは、テストしているオブジェクト以外のオブジェクトが依存していると想定することができるようにすることです。

Coordinatorが期待どおりに動作していることを前提として、デフォルト状態でcheckStudentsが呼び出されたときに、checkCalendarが呼び出されたことを確認しています。

あなたがcheckCalendarの戻り値を確認したい場合は、さまざまな条件の下で、その戻り値をテストCoordinatorTestsで別のテストメソッドを記述する必要があります

// CalendarTests.m 

- (void) testCheckCalendar 
{ 
    // Do some setup to mock the conditions created by checkStudents 

. 
.  
. 

    // Verify 
    XCTAssertEqual([[Cooridnator sharedInstance] checkStudents], YES); 
} 
+1

これが正解です。 'checkStudents'のテストを書くべきです。これはあなたが持っているものです。 'checkCalendar'のための別のテストを書く必要があります。このテストでは、おそらくOCMockはまったく必要ありません。メソッドを呼び出して戻り値のアサーションを作成するだけです。 –

関連する問題