9

私は障害物にぶつかっていて、ここの素晴らしい集団精神が助けになるかどうか疑問に思っています. ObjC CocoaTouch では、構造体パラメーターを受け取り、構造体を返すオブジェクトをモックしようとしています。OCMock が毛玉を吐いているので、Hamcrest マッチャでラッピングしてみました。死ぬな。私がテストしている関数/メソッドは次のようになります。

- (CLLocationCoordinate2D)pixelToLatLong:(CGPoint)aPoint;

私は次のようなコードを使用します:

#define OCMOCK_STRUCT(atype, variable) [NSValue value:&variable withObjCType:@encode(atype)]
-(void) testMyWidget
{
    CLLocationCoordinate2D ulLL = (CLLocationCoordinate2D){123,456};
    CLLocationCoordinate2D lrLL = (CLLocationCoordinate2D){654,321};
    [[[(id)myObj expect] andReturn:OCMOCK_STRUCT(CLLocationCoordinate2D, ulLL)] pixelToLatLong:(CGPoint){0,0}];
    [[[(id)myObj expect] andReturn:OCMOCK_STRUCT(CLLocationCoordinate2D, lrLL)] pixelToLatLong:(CGPoint){320,460}];//lower right point
}

それはちょっとうまくいきます。したがって、テストしているオブジェクトで、必要な編集を行って、緑色のバーを取得します...エラー..ビルド情報ウィンドウの緑色のボタン。テストに合格するはずだと確信している場合、アサーション失敗エラーが発生します。エラーは、メソッドが予期せず呼び出されたことを通知し、これらの構造体の値を疑問符としてリストします。Hamcrestマッチャーで構造体をラップしようとしましたが、どこにも行きません。私はデバッガーを分解する準備をしています。間違いなく何が問題なのかを教えてくれます。OCMock/Hamcrest と構造体で同様の問題を抱えている人はいますか? もしそうなら、これらのタイプを処理する最良の方法は何ですか?

4

4 に答える 4

3

あなたはとても近いです。#defineは次のようになります。

#define OCMOCK_STRUCT(atype, variable) [NSValue valueWithBytes:&variable withObjCType:@encode(atype)]
于 2010-06-07T14:42:03.903 に答える
3

最良の答えは実際にはクリフ自身です:http://codeforfun.wordpress.com/2009/02/07/ocmock-return-a-struct/

彼はこの質問を更新しなかった、恥ずべき恥:)

于 2011-02-21T01:09:02.317 に答える
2

マクロの回答に問題がありました。テスト クラスで構造体を返すヘルパー関数を作成し、以下を使用します。

[[[mockObject stub] andCall:@selector(selectorName) onObject:self] someMethod];

本当にうまくいきました。

于 2010-09-30T16:50:37.877 に答える
0

モック オブジェクト フレームワークを通常の使用パターンの外に強制しようとするよりも、手動でコード化されたモックの方が簡単な場合があります。

于 2010-01-09T03:42:09.160 に答える