1

私がテストしているクラスには2つのメソッドがあります:

- (NSUInteger)sendBuffer:(uint8_t *)buffer length:(NSUInteger)length;
- (BOOL)sendFormattedCommandForAddress:(uint8_t)address 
                              withData:(uint8_t)data 
                        andCommandType:(ZKZSensorCommandType)commandType;

-sendFormattedCommandForAddress:withData:andCommandType:配列を作成し、charこの配列へのポインタを に渡します-sendBuffer:length:。この配列の内容は、、、addressおよびdataによって異なりますcommandType。私のテストでは、正しい配列が作成されて に渡されることを確認したいと思います-sendBuffer:length:uint8_t *OCMock では、引数に期待値を設定できません。OCMockito/OCHamcrest では、(まだ) 部分モックを使用できません。-sendBuffer:length:テスト ケース クラスのメソッドを呼び出すメソッドと、そのメソッド呼び出しに期待値を設定するメソッドを入れ替えてみました。ただし、swizzled メソッドが呼び出されると、self私のテストケースではなく、テスト中のクラスを指しています。テスト対象のクラスでバッファーを保持し、テストでこのバッファーの内容を確認することはできますが、テストをサポートするためだけに実稼働コードに何かを追加するのは嫌いです。この動作をテストする方法について、より良い提案はありますか?

4

2 に答える 2

0

モックを作成するためにモッキング フレームワークは必要ありません。問題は、実際には を呼び出したくないということだと思います-sendBuffer:length:。その場合は、Michael Feathers の著書Working Effectively with Legacy Codeで説明されている Subclass と Override Method を使用してください。

あなたのクラスの名前がわからないので、Sender と呼びます。これは、SenderTest.m にそのまま入れて、私が書くものです。

@interface TestingSender : Sender
@property (assign, nonatomic) NSUInteger sendBufferCount;
@property (assign, nonatomic) uint8_t *sendBufferBuffer;
@property (assign, nonatomic) NSUInteger sendBufferLength;
@end

@implementation TestingSender

- (NSUInteger)sendBuffer:(uint8_t *)buffer length:(NSUInteger)length
{
    ++_sendBufferCount;
    _sendBufferBuffer = buffer;
    _sendBufferLength = length;
}

@end

次に、テスト コードは Sender の代わりに TestingSender を作成します。

于 2013-01-26T06:03:07.973 に答える
0

これはおそらく意見の問題ですが、包括的な単体テストの利点により、コードの複雑さのわずかな増加と抑制は価値のあるトレードオフになります。あなたが説明した場合、送信された最後のバイトシーケンスを取得して単体テストでアサートできるように、プロダクションクラスにバッファーを追加するというあなたのアイデアは、完全に優れたアプローチだと思います。

個人的には、バッファを維持するかどうかを制御する boolean プロパティを追加するかもしれません。これは、製品コードで大きなメッセージが送信された場合に偶発的な不必要なメモリ オーバーヘッドを回避するためです。もちろん、単体テストのセットアップではこのプロパティが設定されますが、アプリケーション/フレームワークのプロダクション コードでは設定されません。繰り返しになりますが、重要なのは、追加するコードを非常に単純にして、明らかに正しいことです。:-)

プロダクション クラスが公開するインターフェイスを厳密に厳密にする必要がある場合は、バッファを維持するコードを条件付きコンパイルに依存させることを検討することもできます。私は個人的に前者のアプローチを好みますが、それぞれに独自の方法があります。

于 2013-01-21T20:01:21.793 に答える