在猕猴桃(iOS)嘲笑代表的期望

问题的简短版本:

以下Kiwi / iOS模拟期望有什么问题?

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

长版问题:

我正在尝试在猕猴桃,iOS的一个简单的类处理NSConnection的testing。 为了testing这个类是如何处理NSConnection的callback函数的,我发送NSConnection的委托方法。 我有一个class级的代表,把数据发回给我的class级。 为了testing我的类,我必须注入一个模拟委托,然后检查我所需的方法被调用。 就那么简单 :)

我的代码为猕猴桃testing是:

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

此代码工作正确。 用检查点debugging显示它按预期执行。 statusCode的值是11111.txt是testString1 + textString2。 仍然在testing的最后一行失败,出现以下错误:

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

删除testing中的最后一行仍然会产生相同的错误。 我猜我的理解接收:withArguments:是错误的..

在调用connectionDidFinishLoading 之前 ,你必须调用[[mockDelegate should] receive...来为准备接收的消息准备mockDelegate。