1

ネットワーク処理を実行するための単純なクラスがあります。これはシングルトンであり、そのNSOperationQueue中にカプセル化されています。クラスのユーザーがネットワークからデータを取得するために何らかのメソッドを呼び出すと、このクラスは、から継承された操作クラスの適切なインスタンスを作成しNSOperation、実行のためにキューに追加します。明らかに、その実行は別々のスレッドで非同期に行われます。ネットワーク継承オブジェクトからデータを取得した後NSOperation、ネットワーク クラスに通知し、関心のあるデリゲートにデータの終了またはエラーについて通知します。

質問は、ネットワーク クラスのロジックをチェックするための単体テストを作成するにはどうすればよいですか? また、実際にはサーバー側の動作をテストしたくありません。サーバーへの実際の非同期呼び出しを、テストハンドラーの動作後のモックおよび定義済みの回答に置き換えたいだけです。サーバー側ではなく、クラスがどのように機能するかを確認したい。私はそのようなものをテストするための一般的なロジックを理解していますが、OCMock を使用することに少し混乱しています。最良の答えはコード例です。単体テストのためにプロジェクトで OCUnit と OCMock を使用しています。

また、記事や github リンクも完璧です。

4

2 に答える 2

3

すべての非同期呼び出しがクラスの内部メソッドを通過する場合、オブジェクトに部分的なモックを作成し、そのメソッドでスタブ/期待を使用するだけです。その後、パブリック メソッドを通常どおり呼び出し、モックを使用して内部メソッドが呼び出されていることを確認できます。部分モックを使用すると、実際の実装が呼び出されなくなり、ネットワーク アクティビティが発生しなくなります。

残りの半分、非同期操作からのコールバックについては、テストから直接呼び出されるメソッドを呼び出すだけで、OCUnit アサートで状態をチェックするか、または次に、別のモックでコールバックを使用します。

于 2013-06-02T19:18:38.857 に答える
1

だから私はこれがOCMockに関するものであることを知っています...しかし、私はこれをKiwiでうまくやっていることをそこに出そうと思っていました.それはこのように見えます.

it(@"should refresh the client's temporary API key if it is stale before sending the request", ^{
    ISLDataServiceAdd *addRequest = [ISLDataServiceAdd withRecord:@{ISLFieldContact_FirstName: @"Jason"} table:ISLTableContact];

    [[clientMock shouldEventually] receive:@selector(apiKey) andReturn:VALID_API_KEY];
    [[clientMock shouldEventually] receive:@selector(hasTemporaryAPIKey) andReturn:theValue(YES)];
    [[clientMock shouldEventually] receive:@selector(isTemporaryAPIKeyStale) andReturn:theValue(YES)];
    [[clientMock shouldEventually] receive:@selector(refreshTemporaryAPIKeyAndWait:)];

    [addRequest sendRequestUsingClient:clientMock completion:nil failure:nil];
});

sendRequestUsingClient:completion:failure:は非同期呼び出しであるため、shouldEventuallyKiwi で使用することにより、それらのセレクターが呼び出されるまでにしばらく (デフォルトは 1 秒) 待機する必要があることがわかります。

于 2013-06-01T19:23:46.803 に答える