0

我正在编写一个天气应用程序,我创建了一种天气模型,它可以执行所有计算、获取数据等。在创建 ViewControllers 之前,我想为我的模型编写一些单元测试以确保一切正常正常工作(正在以预期的格式获取天气,天气正在正确刷新等)。

现在我很想充满信心地进行单元测试并测试平等,例如:

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

...但是,唉,大自然的变化如此之快。另外,(并纠正我的问题),我认为我在进行单元测试时无法连接到 Internet(...?)(无论如何,这并不重要。)

所以,我在我最喜欢的网站上搜索,发现了这个问题:如何对 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

我认为您正在尝试进行过于广泛的测试。你想在这里测试两件事: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 回答