19

次のシグネチャに相当するメソッドをモックしようとしています:

- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError **)error

テストでコードが辞書を適切に使用していることを確認できるように、小さな辞書を返すようにします。ただし、私が何をしても、OCMock は、どのようにスタブ化したかに関係なく、常にメソッドから nil を返します。エラーは、テストしているコードで nil として始まります。これらは、スタブしようとしたさまざまな方法です。

NSError * error = nil;
[[[mock stub] andReturn:someDict] uploadValues:YES error:&error];

[[[mock stub] andReturn:someDict] uploadValues:YES error:nil];

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg any]];

そしてどれも機能しません。OCMock はハンドルをスタブ化されたメッセージ引数としてサポートしていますか? もしそうなら、それを行う正しい方法は何ですか?

4

5 に答える 5

49
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:nil]];

また

NSError* someError = ...
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:someError]];

あなたもできる

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg anyPointer]];

しかし、これにより、実際の NSError を返したとコードが誤って判断する可能性があります。

于 2009-12-17T21:39:35.270 に答える
3

ARC では、メソッド宣言はおそらく次のようになります。

- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError *__autoreleasing *)error;

これらのタイプのメソッドをモックする方法は次のとおりです。

BOOL mockDoSomething = YES;

NSError __autoreleasing *error = nil;

[[[mock stub] andReturn:someDict] uploadValues:OCMOCK_VALUE(mockDoSomething) error:&error];
于 2012-08-09T23:26:10.093 に答える
3
NSError *__autoreleasing *err = (NSError *__autoreleasing *) [OCMArg anyPointer];

[[[_mockReporter stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})]
   yourMethodCall:err];
于 2013-03-06T17:54:10.727 に答える
3

この状況を支援するために、OCMArg にカテゴリを作成しました。

OCArg+Helpers.h:

@interface OCMArg (Helpers)

+ (NSError *__autoreleasing *)anyError;

@end

OCMarg+Helpers.m:

@implementation OCMArg (Helpers)

+ (NSError *__autoreleasing *)anyError {
    return (NSError *__autoreleasing *)[OCMArg anyPointer];
}

@end

次に、モックする必要があるエラー パラメータがあるときはいつでもanyError、次のように使用します。

[[myMock stub] someMethodWithArg:anArg error:[OCMArg anyError]];
于 2014-01-03T20:55:52.447 に答える
-4

悲しいことに、これに対する良い解決策も見つかりませんでした。私が言える最善のことは、NSError** の使用をできるだけ小さくしてから、部分モックで完全にモックできる分離された関数に入れることです。

NSObject* (または派生) またはプリミティブ値 (NSInteger、BOOL など) 以外を使用するコードは、OCMock を使用してテストすることはほとんど不可能です。

于 2009-12-09T22:01:39.823 に答える