嘲笑Kiwi(iOS)对代表的期望

Sun*_*kas 5 testing mocking objective-c ios kiwi

问题的简短版本:

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

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

长版问题:

我正在尝试在Kiwi中编写一个测试,用于处理NSConnection的简单类.为了测试该类处理来自NSConnection的回调,我向它发送NSConnection通常所做的委托方法.我在类中有一个委托,它将数据发送回使用我的类的人.为了测试我的类,我必须注入一个模拟的委托,然后检查我所需的方法是否被调用.就那么简单 :)

我的Kiwi测试代码是:

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

});
Run Code Online (Sandbox Code Playgroud)

在我的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;
}
Run Code Online (Sandbox Code Playgroud)

此代码有效且正确.使用检查点对其进行调试显示它按预期执行.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).
Run Code Online (Sandbox Code Playgroud)

删除测试中的最后一行仍会生成相同的错误.我想我对接收的理解:withArguments:是错误的..

Pie*_*ers 6

你必须调用[[mockDelegate should] receive... 之前调用connectionDidFinishLoading准备mockDelegate它是关于接收消息.