0

メソッドの引数の 1 つに特定のポインター値を使用してモック オブジェクトでメソッドが呼び出されることを確認しようとしていますが、「引数の型 '*' はサポートされていません」というメッセージが引き続き表示されます。モックされたメソッドが呼び出されたときの例外。ここに私のテストコードがあります:

uint8_t *buf = calloc(65, sizeof(uint8_t));
id stream = [OCMockObject niceMockForClass:[NSInputStream class]];
[[stream expect] read:buf maxLength:64];
id myStream = [[MyStream alloc] initWithStream:stream];
// myStream should pass read:maxLength: call through to stream
[myStream read:buf maxLength:64];
STAssertNoThrow([stream verify], @"Did not pass call through");

ここにあり-[MyStream read:maxLength:]ます:

- (NSInteger)read:(uint8_t *)buffer maxLength:maxLength {
    // internalStream is the stream passed to -initWithStream:
    return [self.internalStream read:buffer maxLength:maxLength];
}

モックされたストリームで -read:maxLength: を呼び出すと、「引数の型 '*' はサポートされていません」というメッセージが表示されます。例外。特定のポインター引数値での呼び出しを期待することは可能ですか?

編集:

この問題は char * (または uint8_t ) 引数に固有のようです。Objective C はそれらを ' ' として @encode し、OCMock の型処理コードは '^' でエンコードされた値のみをポインタとして扱います。私はハッキングを試み+[OCMArg resolveSpecialValues:]-[NSInvocation getArgumentAtIndexAsObject:](NSInvocation+OCMAdditions.m で) '*' を '^' と同じように扱いました。これで例外は停止しましたが、私の期待はまだ満たされていません。

他にこれを処理する方法を知っている人はいますか?ありがとう!

4

1 に答える 1

0

この問題の回避策を見つけました。'*' でエンコードされた型を処理するように OCMock を修正しようとするのは、うさぎの穴でいっぱいでしたが、OCMock が動作できるメソッド シグネチャを返すように NSInputStream にカテゴリを作成することで、テストを機能させることができました。

@interface NSInputStream (OCMockFix)
  + (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)selector;
  - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector;
@end

@implementation NSInputStream (OCMockFix)
  + (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)selector {
    if (sel_isEqual(selector, @selector(read:maxLength:))) {
      // Original signature is "i@:*I". Change '*' to '^C'
      return [NSMethodSignature signatureWithObjCTypes:"i@:^CI"];
    } else {
      return [super instanceMethodSignatureForSelector:selector];
    }
  }
  - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
    return [[self class] instanceMethodSignatureForSelector:selector];
  }
@end
于 2013-02-11T16:58:58.400 に答える