4

サードパーティの Web サービスに接続する iOS アプリを開発中です。約 50 の異なる呼び出しがあり、Kiwi を使用して単体テストを作成したいと考えていますが、どこから始めればよいかわかりません。

私は API の責任者ではないので、正しい GET または POST メソッドを使用して、自分の呼び出しが正しい URL を指していることを確認する必要があります。

これを適切にテストする方法はありますか?

私の呼び出しの1つの例を次に示します。

+ (void)listsForUser:(NSString *)username
            response:(void (^)(NSArray *lists))completion
{
    NSString *path = [NSString stringWithFormat:@"user/list.json/%@/%@", TRAKT_API_KEY, username];
    [TNTraktAPIManager requestWithMethod:GET
                                    path:path
                              parameters:nil
                                callback:^(id response) {
                                    completion(response);
                                }];
}

次のヘルパー メソッドを呼び出す

+ (void)requestWithMethod:(HTTPMethod)method
                     path:(NSString *)path
               parameters:(NSDictionary *)params
                 callback:(void (^)(id response))completion
{
    NSString *methodString = @"POST";
    if (method == GET) {
        methodString = @"GET";
    }


    // Setup request
    NSURLRequest *request = [[TraktAPIClient sharedClient] requestWithMethod:methodString
                                                                        path:path
                                                                  parameters:params];

    // Setup operation
    AFJSONRequestOperation *operation =
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request
                                                    success:^(NSURLRequest *request,
                                                              NSHTTPURLResponse *response,
                                                              id JSON) {
                                                        id jsonResults = JSON;
                                                        completion(jsonResults);

                                                    } failure:^(NSURLRequest *request,
                                                                NSHTTPURLResponse *response,
                                                                NSError *error,
                                                                id JSON) {

                                                        id jsonResults = JSON;
                                                        completion(jsonResults);
                                                        NSLog(@"%s: error: %@", __PRETTY_FUNCTION__, error);

                                                    }];
    // TODO: Queue operations
    [operation start];

}
4

2 に答える 2

5

shouldEventuallyヘルパー クラスに期待値を設定してreceive:(SEL)withArguments:(id)...フォームを使用すると、受け取った引数が期待どおりであることを確認できます。

知っておく価値のある 2 つの落とし穴は、電話をかける前に期待値を設定することです。そして、呼び出しが行われるのに十分な時間テストが遅れないようにするのshouldEventuallyではなく、フォームを使用します。should

于 2013-02-19T23:25:04.893 に答える
4

API クラスの 単体テストについては、 OHHTTPStubsを確認することを強くお勧めします。

単体テストは決定論的である必要があり、インターネットに潜在的に予測不可能な API をミックスに追加すると、テスト条件が非決定論的になります。

OHTTPStubs を使用すると、発信 HTTP 要求への応答をスタブ化できます。基本的に、HTTP トラフィックをインターセプトし、リクエストが設定した基準に一致する場合、(API からの予測不可能な結果ではなく) JSON で宣言する既定の応答を返します。これにより、テスト クラスでさまざまな応答シナリオを構成できます。404 エラー、部分応答データなどをテストで使用します。

次に例を示します。

この JSON スタブを作成し、JSON ファイルとして保存しました。

{
    "devices" :     [
                   {
                     "alarm" :            {
                     "alarm_id" : 1,
                   "attack_time" : "<null>",
                   "defined_time" : "2014-04-14T04:21:36.000Z",
                   "device_id" : 7,
                   "is_protected" : 0
                   },
                   "device_type" : "iPhone",
                   "id" : 7,
                   "os_version" : "7.1"
                   }
                   ],
    "email" : "mystubemail@gmail.com",
    "facebook_id" : 5551212,
    "id" : 3,
    "name" : "Daffy Duck"
}

API 呼び出しで I ネットワーク リクエストが行われるたびに、この OHHTTPStub がすべてのテストの前に実行されるようにテスト クラスで宣言されているため、この JSON が返されます。

[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
            BOOL stringFound;

            if ([[request.URL description] rangeOfString:[NSString stringWithFormat:@"%@devices/register?", BASEURL]].location != NSNotFound)
            {
                stringFound = YES;
            }
            NSLog(@"%d", stringFound);

            return stringFound;

        } withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) {
            // Stub it with our "RegisterDevice.json" stub file

            return [[OHHTTPStubsResponse responseWithFileAtPath:OHPathForFileInBundle(@"RegisterDevice.json",bundle)
                                                     statusCode:200 headers:@{@"Content-Type":@"text/json"}] requestTime:1.0 responseTime:1.0];
        }];

Kiwi で非同期テストが許可されているかどうかはわかりませんが、許可されていない場合は、Specta とそれに対応するフレームワークである Expecta も検討することをお勧めします。OHHTTPStubs と組み合わせると、API 呼び出しの単体テストに必要なすべてを提供する、非常に簡単な非同期単体テストが可能になります。

于 2014-04-18T23:39:42.233 に答える