0

私は気象アプリケーションを作成しており、すべての計算、データのフェッチなどを行う一種の気象モデルを作成しました。ViewController を作成する前に、モデルの単体テストをいくつか作成して、すべてが適切であることを確認したいと考えていました。正常に動作しています (天気が期待される形式で取得されている、天気が正しく更新されているなど)。

今、私は自信を持って単体テストを行い、次のように等しいかどうかをテストしたいと思います:

STAssertEquals([[testableModel weatherDictionary]objectForKey:@"current_conditions"], @"Sunny", @"The weather should be sunny.");

...しかし悲しいことに、母なる自然は急速に変化します。また、(訂正します)単体テスト中はインターネットに接続できないと思います(…?)(どちらでも構いません。)

そこで、私のお気に入りの Web サイトを検索したところ、次の質問が見つかりました。NSURLConnection デリゲートを単体テストする方法は?

とても参考になりましたが、質問があります。次のような NSURLConnection デリゲート メソッドを呼び出すメソッドを呼び出すと、

[myBeautifulWeatherModel getTheWeather];

...モデル (つまり、NSURLConnection デリゲート メソッドを実装している myBeautifulWeatherModel) のデータをフィードするにはどうすればよいですか? モデルは、このデリゲート メソッドでデータを受け取ると、JSON 解析を実行します。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

私が最初に考えたのは、Wunderground から返された JSON データを取得し、いくつかのキーを変更して、期待されるデータと一致するようにし、それをフィードすることでした。しかし、問題は、その応答をどのようにフィードするかということです。

NSURLConnection が 3 つの必須デリゲート メソッドを呼び出すことを理解しています。次のことを「偽造」する必要があるように感じます。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

しかし、繰り返しになりますが、どのようにそれをフィードして、このモデルにインターネットに接続されていると思わせるかについて、少し混乱しています。

4

1 に答える 1

0

広範にテストしようとしていると思います。ここでテストしたいのは、2つのことです。1)NSURLConnectionDelegateコールバックが呼び出されると、データは有用な場所に正しく書き込まれます。2)接続が完了すると、保存されたデータが与えられると、モデルに適切に保存されます。だからこのようなもの:

-(void)testShouldAppendData {
    expect([connectionDelegate data]).to.beNil();

    NSString *response = @"1";
    NSData *responseData = [input dataUsingEncoding:NSUTF8StringEncoding];
    [connectionDelegate connection:connection didReceiveData:responseData];

    NSString *stringFromResponseData = [[[NSString alloc] initWithData:[connectionDelegate data] encoding:NSUTF8StringEncoding] autorelease];
    expect(stringFromResponseData).to.equal(@"1");

    [connectionDelegate connection:connection didReceiveData:responseData];
    stringFromResponseData = [[[NSString alloc] initWithData:[connectionDelegate data] encoding:NSUTF8StringEncoding] autorelease];
    expect(stringFromResponseData).to.equal(@"11");
}

およびデータ形式の場合:

-(void)testShouldUpdateWeatherModel {
    NSString *response = @"{\"current_conditions\":\"sunny\"}}";
    NSMutableData *responseBytes = [NSMutableData dataWithData:[response dataUsingEncoding:NSUTF8StringEncoding]];
    [connectionDelegate setData:responseBytes];

    [connectionDelegate connectionDidFinishLoading:nil];

    expect([[connectionDelegate weatherDictionary] objectForKey:@"current_conditions"]).to.equal(@"sunny");
}
于 2012-07-30T18:03:38.970 に答える