2012-04-16 1 views
5

укороченная версия вопроса:Mocking ожидания в Киви (IOS) для делегата

Что неправильно в следующем Киви/IOS макете ожидания?

Длинная версия вопроса:

Я пытаюсь написать тест в киви, прошивке для простого класса, который обрабатывает соединение NSConnection. Чтобы проверить, что класс обрабатывает обратный вызов из NSConnection, я отправляю ему методы делегата, которые обычно выполняет NSConnection. У меня есть делегат в классе, который отправляет данные тому, кто использует мой класс. Чтобы протестировать мой класс, я должен ввести посмеянного делегата, а затем проверить, вызваны ли мои нужные методы. Просто как то :)

Мой код для теста Киви:

//Some ivars declared elsewhere: 
testString1 = @"asd323/4 d14"; 
testString2 = @"as98 /2y9h3fdd14"; 
testData1 = [testString1 dataUsingEncoding:NSUTF8StringEncoding]; 
testData2 = [testString2 dataUsingEncoding:NSUTF8StringEncoding]; 
mockURLRespons = [NSHTTPURLResponse mock]; 
int value = 11111; 
id mockDelegate = [KWMock mockForProtocol:@protocol(SharepointConnectionDelegate)]; 
communicator = [[SharepointCommunicator alloc] init]; 

it (@"should send recieve data back to delegate2", ^{ 
    [communicator setDelegate:mockDelegate]; 
    [mockURLRespons stub:@selector(statusCode) andReturn:theValue(value)]; 
    [(id)communicator connection:niceMockConnector didReceiveResponse:mockURLRespons]; 
    [(id)communicator connection:niceMockConnector didReceiveData:testData1]; 
    [(id)communicator connection:niceMockConnector didReceiveData:testData2]; 
    [(id)communicator connectionDidFinishLoading:niceMockConnector]; 

    [[mockDelegate should] receive:@selector(connectionDidSucceedWithText:andStatus:) withArguments:[testString1 stringByAppendingString:testString2],theValue(value),nil]; 

}); 

И в моем SharepointCommunicator.m:

-(void)connection:(NSURLConnection *)aConnection didReceiveResponse:(NSURLResponse *)response { 
    if (connection != aConnection) { 
     [connection cancel]; 
     connection = aConnection; 
    } 
    responseData = [[NSMutableData alloc] init]; 
    statusCode = [(NSHTTPURLResponse*)response statusCode]; 
} 

-(void)connection:(NSURLConnection *)aConnection didReceiveData:(NSData *)data { 
    if (aConnection != self.connection) 
    return; 
    [responseData appendData:data]; 
} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    NSString *txt = [[NSString alloc] initWithData:responseData encoding: NSASCIIStringEncoding]; 
    NSLog(@"Statuscode: %i", statusCode); 
    NSLog(@"Data is: %@",txt); 
    [delegate connectionDidSucceedWithText:txt andStatus:statusCode]; 
    [self.connection cancel]; 
    self.connection = nil; 
} 

Этот код работает и правильно. Отладка его с помощью контрольной точки показывает, что она работает так, как ожидалось. Значения statusCode равны 11111. и txt - testString1 + textString2. Тем не менее он не на последнем ряду на в тесте со следующим сообщением об ошибке:

error: -[kiwiSharepointCommunicatorTest Sharepointcommunicator_AStateTheComponentIsIn_ShouldSendRecieveDataBackToDelegate2] : 'Sharepointcommunicator, a state the component is in, should send recieve data back to delegate2' [FAILED], mock received unexpected message -connectionDidSucceedWithText:"asd323/4 d14as98 /2y9h3fdd14" andStatus:11111 
Test Case '-[kiwiSharepointCommunicatorTest Sharepointcommunicator_AStateTheComponentIsIn_ShouldSendRecieveDataBackToDelegate2]' failed (3.684 seconds). 

Удаление последней строки в тесте по-прежнему генерировать ту же ошибку. Я предполагаю, что мое понимание получать: withArguments: это неправильно ..

+0

Я предполагаю, что это имеет какое-то отношение к аргументам Киви. Возможно, матч идет по указателям на объекты? И поэтому строки не совпадают, даже если они содержат одни и те же строки? Или, возможно, он не может обрабатывать сопоставление не-объектов, таких как ints ... – Sunkas

+0

У меня такая же проблема, мой делегат передает строки своему делегату (макет) – quantumpotato

ответ

6

Вы должны вызвать [[mockDelegate should] receive...перед тем призыв к connectionDidFinishLoading подготовить mockDelegate для сообщения он собирается получить.

+0

Прошло некоторое время с тех пор, как я закодировал это, но Я совершенно уверен, что вы правы. Я переделал его более мелким способом и получил его обратно. Вероятно, потому, что ожидание теперь было настроено заранее. – Sunkas