2012-04-16 24 views
5

phiên bản ngắn của câu hỏi:mong đợi Mocking trong Kiwi (iOS) cho một đại biểu

Điều gì là sai với Kiwi/iOS kỳ vọng mô hình sau đây?

Long phiên bản của câu hỏi:

Tôi cố gắng để viết một bài kiểm tra trong Kiwi, iOS cho một lớp đơn giản để xử lý một NSConnection. Để kiểm tra rằng lớp xử lý cuộc gọi lại từ NSConnection, tôi gửi nó các phương thức đại diện mà NSConnection thường làm. Tôi có một đại biểu trong lớp gửi dữ liệu về cho bất cứ ai sử dụng lớp học của tôi. Để kiểm tra lớp của tôi, tôi phải tiêm một ủy nhiệm giả mạo và sau đó kiểm tra xem các phương thức mong muốn của tôi có được gọi hay không. Đơn giản như vậy :)

Mã của tôi cho kỳ thi này Kiwi là:

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

}); 

Và trong SharepointCommunicator.m tôi:

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

Mã này hoạt động và là đúng. Gỡ lỗi nó với trạm kiểm soát cho thấy nó như mong đợi. Các giá trị của statusCode là 11111. và txt là testString1 + textString2. Vẫn thất bại trên hàng cuối cùng trong thử nghiệm với lỗi sau:

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

Xóa hàng cuối cùng trong thử nghiệm vẫn tạo ra lỗi tương tự. Tôi đoán sự hiểu biết của tôi về nhận: withArguments: là sai ..

+0

Tôi giả định rằng nó có liên quan đến việc đối chiếu với Kiwi. Có lẽ trận đấu là trên con trỏ đến các đối tượng? Và đó là lý do tại sao các chuỗi không khớp, ngay cả khi chúng có chứa cùng một chuỗi? Hoặc có lẽ nó không thể xử lý phù hợp với không đối tượng như ints ... – Sunkas

+0

Tôi đang gặp một vấn đề tương tự, đại biểu của tôi là đi dây cho đại biểu của mình (giả) – quantumpotato

Trả lời

6

Bạn phải gọi [[mockDelegate should] receive...trước cuộc gọi đến connectionDidFinishLoading để chuẩn bị mockDelegate cho thông điệp đó là về để nhận.

+0

Đó là một thời gian kể từ khi tôi mã hóa này, nhưng Tôi khá chắc chắn rằng bạn là chính xác. Tôi đã recode nó một cách nhỏ hơn và nhận được nó làm việc trở lại sau đó. Có lẽ vì kỳ vọng hiện đã được thiết lập trước. – Sunkas

Các vấn đề liên quan