0

2 つの構造体が同等であると主張したいとします。

// Using CGPoint here for brevity, but my question applies to any struct type
CGPoint a = CGPointMake(1, 2);
CGPoint b = CGPointMake(1, 2);
STAssertEquals(a, b, @"this works");
assertThat(a, equalTo(b));

上記のように動作する Hamcrest を使用してアサーションを記述する方法はありませんSTAssertEqualsか? assertThatマクロはidパラメーターを想定しているため、この行はコンパイルに失敗しますが、構造体はそうではありません。equalToなどのマッチャーのバリエーションを試しましたが、すべて型付きパラメーターsameInstanceが必要なようです。次に、良い回避策は、任意の式がorの値idを持つことをアサートすることだと思いました。このようなもの:YESNO

assertThat(a == b);

またはこれ:

assertThat(a == b, isTrue());

しかし、ハムクレストではこのようなものは見当たりません。

明らかな何かが欠けていますか?などの SenTest マクロを使用してやりたいことを達成できることは明らかですが、Hamcrest を使用してSTAssertEqualsこれらのアサーションを実装するのは簡単だと思っていたので、すべてのアサーションが一貫したスタイルになります。

また、比較している特定の構造体に対してカスタム Hamcrest マッチャーを実装することで、これを実行できることもわかっています。しかし、単純なバイト単位の等価性について C 構造体を比較できる単純なアサーション/マッチャーを本当に探していました。

おそらく、私が言及した可能性のどれも、Hamcrest をそのまま使用することはできないという単純なケースです。それが本当なら、私はこの趣旨の説得力のある説明を回答として受け入れます。

ありがとう

4

1 に答える 1

0

OCHamcrest は、オブジェクトの一致をチェックするように設計されているためassertThat、引数を最初のパラメーター (およびマッチャーを 2 番目のパラメーター) として受け取ります。

スカラーのサポートは限定されています。たとえば、次のように言えます。

assertThatInteger(a, equalToInteger(b));

NSValue マッチャーの変更が送信されましたが、まだ確認する時間がありません。それは NSPoint や NSSize などへの扉を開きます。それでも、OCHamcrest でのスカラー サポートは回避策です。

独自の構造体には、STAssertEquals. 問題は、これが全か無かの等価比較であり、テストが脆弱になる可能性があることです。その場合は、フィールドごとのマッチングをサポートする独自のカスタム マッチャーを作成することをお勧めします。(NSValue マッチャをサブクラス化できるものにしようと思います。)

于 2012-03-07T14:32:00.260 に答える