2012-04-16 15 views
5

versión corta de la pregunta:expectativas en burlando de kiwi (IOS) para un delegado

Qué hay de malo con la siguiente expectativa simulacro Kiwi/IOS?

Versión larga de la pregunta:

Estoy tratando de escribir un ensayo en el kiwi, el IOS para una clase simple que maneja una NSConnection. Para probar que la clase maneja la devolución de llamada desde NSConnection, le envío los métodos delegados NSConnection normalmente lo hace. Tengo un delegado en la clase que envía datos a quien usa mi clase. Para probar mi clase, tengo que inyectar un delegado burlado y luego verificar que se llamen mis métodos deseados. Tan simple como eso :)

Mi código para la prueba del kiwi es:

//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]; 

}); 

Y en mi 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; 
} 

Este código funciona y es correcta. Depurarlo con punto de control muestra que funciona como se esperaba. Los valores de statusCode son 11111. y txt es testString1 + textString2. Aún así, falla en la última fila de la prueba con el siguiente error:

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). 

Extracción de la última fila de la prueba sigue generará el mismo error. Creo que mi comprensión de recibir: withArguments: está mal ..

+0

Supongo que tiene algo que ver con la coincidencia de argumentos de Kiwi. Tal vez la coincidencia está en los punteros a los objetos? Y es por eso que las cadenas no coinciden, incluso si contienen las mismas cadenas. O tal vez no puede manejar la coincidencia de no objetos como ints ... – Sunkas

+0

Tengo un problema similar, mi delegado está pasando cadenas a su delegado (el simulacro) – quantumpotato

Respuesta

6

Tienes que llamar [[mockDelegate should] receive... antes de la llamada a connectionDidFinishLoading para preparar el mockDelegate por el mensaje que está a punto de recibir.

+0

Ha pasado algún tiempo desde que codifiqué esto, pero Estoy bastante seguro de que tienes razón. Lo recodé de una manera más pequeña y lo hice funcionar en ese entonces. Probablemente porque la expectativa ahora se estableció por adelantado. – Sunkas

Cuestiones relacionadas