36

私の日常の仕事では、モック メソッドが呼び出されないことを確認できるMockitoの validationに甘やかされてきました。never()

Objective-C と OCMock を使用して同じことを達成する方法はありますか? 以下のコードを使用していますが、動作しますが、ハックのように感じます。もっと良い方法があるといいのですが...

- (void)testSomeMethodIsNeverCalled {
    id mock = [OCMockObject mockForClass:[MyObject class]];
    [[[mock stub] andCall:@selector(fail) onObject:self] forbiddenMethod];

    // more test things here, which hopefully
    // never call [mock forbiddenMethod]...
}

- (void)fail {
    STFail(@"This method is forbidden!");
}
4

6 に答える 6

64

OCMock の r69 以降、メソッド呼び出しを拒否することができますhttp://svn.mulle-kybernetik.com/OCMock/trunk/Source/Changes.txt

優れたモック / 高速で失敗する モック オブジェクトでメソッドが呼び出されると、expect または stub のいずれかが設定されていない場合、モック オブジェクトは例外を発生させます。このフェイルファスト モードは、"nice" モックを作成することでオフにすることができます。

id mock = [OCMockObject niceMockForClass:[SomeClass class]]

ナイス モックは予期しないメソッドをすべて単純に無視しますが、特定のメソッドを禁止することもできます。

[[mock reject] someMethod]

フェイルファスト モードでは、例外が無視されると、verify が呼び出されたときに再スローされることに注意してください。これにより、通知などからの不要な呼び出しを確実に検出できます。

引用元: http://www.mulle-kybernetik.com/software/OCMock/#features

于 2011-04-18T22:58:00.250 に答える
19

私が知る限り、verify を呼び出し、記録されていないメソッドが呼び出されると、OCMock は自動的に失敗します。予期しないメソッドが呼び出されても文句を言わないモックは、「ナイス モック」と呼ばれます。

- (void)testSomeMethodIsNeverCalled {
    id mock = [OCMockObject mockForClass:[MyObject class]];

    [mock forbiddenMethod];
    [mock verify]; //should fail
}
于 2010-05-02T20:41:42.857 に答える
3

また、部分的にモックしているオブジェクトでメソッドが呼び出されないようにする必要がある場合もあります。

このためのマクロを作成しました:

#define andDoFail andDo:^(NSInvocation *invocation) { STFail(@"Should not have called this method!"); }

私はこのように使用します:

[[[_myPartialMock stub] andDoFail] unexpectedMethod];
于 2013-04-18T15:17:35.263 に答える
0

次のような JavaScript を試すこともできます。

- (void)aMethod {
   __block BOOL b = NO;

   id mock = [OCMockObject mockForClass:[UIView class]];
   [[[mock stub] andDo:^(NSInvocation *i) { b = YES; }] resignFirstResponder];
   [mock resignFirstResponder];

   NSLog(@"And b is: %i", b); // This reads "And b is: 1" on the console
}

このコードに関連するリークがあるかどうかはわかりません。このページを読んでアイデアを得ました: http://thirdcog.eu/pwcblocks/

于 2011-02-23T21:10:41.660 に答える
0

メソッドが呼び出されないようにするには、呼び出される前にアサートする必要があると思いますtestMethod。したがってOCMReject、テストメソッドを実行する前に、実行時にどのメソッドがトリガーされるかをリッスンするようにしてくださいtestMethod

OCMReject([mock someMethod]);
[mock testMethod];
于 2017-08-29T06:58:12.473 に答える