6

OCMock を使用して実際の Web サービス呼び出しをテストしています。

今、私は次のようなことをしています

- (void)testWebservice
{
    id mydelegatemock = [OCMockObject mockForProtocol:@protocol(MySUTDelegate)];
    [[mydelegatemock expect] someMethod:[OCMArg any]];

    [SUT sutWithDelegate:mydelegatemock];

    // we need to wait for real result
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];

    [(OCMockObject*)mydelegatemock verify];
}

正常に動作しますが、そのようなテストにはすべて 2 秒かかることを意味します。

たとえば 2 秒のタイムアウトを設定し、すぐにsomeMethodof を呼び出してテスト ケースを完了する方法はありますか?mydelegatemockverify

4

3 に答える 3

7

このリンクで見つけた便利なユーティリティ関数を使用してこれを行います。

#import <Foundation/Foundation.h>
#import <OCMock/OCMock.h>

@interface TestUtils : NSObject
+ (void)waitForVerifiedMock:(OCMockObject *)mock delay:(NSTimeInterval)delay;
@end

そして実装:

#import "TestUtils.h"
@implementation TestUtils

+ (void)waitForVerifiedMock:(OCMockObject *)inMock delay:(NSTimeInterval)inDelay
{
    NSTimeInterval i = 0;
    while (i < inDelay)
    {
        @try
        {
            [inMock verify];
            return;
        }
        @catch (NSException *e) {}
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
        i+=0.5;
    }
    [inMock verify];
}

@end

これにより、毎回完全に待機することなく、最大遅延 (秒単位) まで待機することができます。

于 2011-09-06T02:21:45.807 に答える
1

Web サービスの機能テスト (それを行う必要がある場合) を、Web サービスの結果を処理するクラスの単体テストから分離します。

単体テストを行うには、Web サービス呼び出しをモックして、モック結果を提供する必要があります。次に、テストは、その明確に定義された結果に対して、クラスがそれに応じて動作することを確認します。

Web サービスの機能テストも行いたい場合 (たとえば、何らかの要求に対して特定の応答を返す場合)、何もモックする必要はありません。サービスを呼び出して、結果に対してアサーションを行うだけです。

テストを分離することで、テストの実行をより細かく制御できます。たとえば、コードを変更するたびに実行速度の速い単体テストを実行し、実行速度の遅い機能テストは毎晩、専用サーバーで、または必要に応じて実行できます。また、テストが失敗した場合、それが自分のコードなのか、Web サービスの問題なのかがわかります。

于 2011-09-06T07:01:06.480 に答える
0

仲間のメンバーがこの関連する質問への回答で示唆しているように、GHUnit に切り替えることもできます。

Xcode 4 の SenTestingKit: 非同期テスト?

ここでGHUnitを見つけることができます

https://github.com/gabriel/gh-unit

于 2012-05-10T12:24:12.900 に答える