4

NSArrayのSTAssertEqualsを使用してNSArrayアイテムの数を確認する正しい方法は何ですか。

以下が機能すると予想されました。

...
STAssertEquals(1, [myArray count], @"One item should be in array");

このコードは、テストの実行時に「タイプの不一致」ランタイムエラーを生成します。

代わりに、NSUIntegerに明示的にキャストする必要があります。

STAssertEquals((NSUInteger)1, [myArray count], @"One item should be in array");

これは機能しますが、明示的なキャストのために見た目は醜いです。

また、STAssertEqualsはより適切に見え(2つの値を比較します)、実際の値と期待値を表示するため、STAssertTrueの使用は避けたいと思います。

Objective-Cでそれをチェックする正しい方法は何ですか?

更新1

unsignedintリテラルとして1uを使用することを提案された回答に感謝します

STAssertEquals(1u, [myArray count], @"One item should be in array");

しかし、@ Aaronが言ったように、それはまだ醜いです-私は直接「1」を使用したいと思います-代わりにmyArray.count==1を使用することを考えています。そしてその理由は、1uがあまりきれいに見えないからです。1は私にとって1です。数学で1uを書くことは決してありません:-)他に何か提案はありますか?

更新2

@ H2CO3が述べたように、1uは常に機能するとは限らず、一部のスレッドで示唆されているように、キャストの問題を解決する期待値のより宣言的な定義を使用できます。

NSUInteger expectedItemsCount = 1;
STAssertEquals(expectedItemsCount, [myArray count], @"One item should be in array");

見た目がすっきりしているので、1uソリューションよりも好きです。しかし、このアプローチの短所は、余分な行があり、コードがあまりコンパクトではないことです。(NSUInteger)1したがって、次の2つのアプローチから選択する必要があるようです。NSUInteger expectedItemsCount = 1;

4

5 に答える 5

4

Cの型システム..

1であるintため、署名されています。署名されていないのでNSArray.countNSUInteger整数リテラルを符号なしにします。

STAssertEquals(myArray.count, 1u, @"+1 item needed");

編集:さらに良いことに、上記は64ビットで失敗します(そこでは動作し1ullます)ので、次のようなものを使用するとどうなりますか

const NSUInteger expectedLength = 1;
STAssertEquals(myArray.count, expectedLength, @"+1 item needed");

(私がこれを盗んだところからのスレッド...)

于 2013-03-24T15:40:59.033 に答える
1

1を無署名にするために使用できますSTAssertEquals(1U, myArray.count, @"One item should be in array");。多分それはまだ醜いです。タイピングが少し少なくなります。

于 2013-03-24T15:40:44.580 に答える
1

1Uは正しいです。しかし、その醜さを避けたい(そしてアサーションのより良い世界に足を踏み入れたい)場合は、OCHamcrestを使用してください:

assertThat(myArray, hasCountOf(1));
于 2013-03-25T16:19:30.723 に答える
0

プロジェクトが充実している場合、またはこのコードの寿命が長いと予想される場合は、このようなものに特定のアサーションを追加することを検討してください。特殊なケースのマクロを定義する

  STArrayCount(myArray,1)

これは次のようなものに拡張できます

  STAssertTrue(myArray.count==1u,@"Expected %u but array count is %u",myArray.count,1);

カスタムアサーションを作成すると、数年後にユニットテストを再検討したときにユニットテストがより明確になり、追加のテストのフックも提供されます。今日myArrayがNSArrayであると仮定しますが、しばらくすると、他のことを行うBigFancyObjectのインスタンスになります。BigFancyObjectsは、コードの大部分をよりクリーンにし、実装の詳細を非表示にするので、それはすべて素晴らしいことです。ただし、何かがBigFancyObjectを無効にし続けるため、BigFancyObjectが有効であることを確認する必要があります。したがって、STArrayCountを次のように再定義できます。

  STAssertTrue(myArray.isValid && myArray.count==...)

そして今、あなたのユニットテストはオブジェクトの妥当性もチェックします。

于 2013-03-25T18:58:37.737 に答える
0

私のやり方は、それらをオブジェクトとして比較することです。これは、32ビットと64ビットで機能し、キャストや不要な変数宣言の必要性を防ぎ、失敗した値を含む素晴らしい失敗メッセージを維持します。

STAssertEqualObjects(@(5), @(datas.count), @"unexpected array count");
于 2013-11-22T16:41:56.610 に答える