בדיקת completionBlocks עם OCMock

בדיקת completionBlocks עם OCMock

יש לנו מתודה ב- Objective C שנראית כך:

- (void)getFileFromServer:(NSString*)url {
    if ([[URLValidator sharedInstance] isValidUrl:url]) {
        [[ServerConnection sharedInstance] getFromUrl:url withTimeout:12.f onCompletion:^(NSData* data) {
            if (data) {
                [[FilesManager sharedApplication] saveFile:data];
            } else {
                NSLog(@"ERROR. Failed to get file.");
            }
        }];
    }
}

קוד פשוט – המתודה מקבלת url, שולחת לבדיקה שזו כתובת תקינה באובייקט URLVAlidator, ואז עם האובייקט ServerConnection הקובץ מתקבל, ונשמר ב- FilesManager.

עד כאן הכל טוב.

השאלה היא איך כותבים לזה טסט. ליצור mock עבור כל אחד מהאובייקטים (במידת הצורך) זה פשוט. partialMock וכו׳. הבעיה זה לבדוק את ה- completionBlock.

הפתרון הוא להוסיף מייד אחרי הקריאה ל- expect, קריאה לביצוע NSInvocation – כלומר אנחנו מפעילים בעצמנו את הבלוק שהולך להגיע כפרמטר (חשוב לשים לב לאינדקס הנכון!). ואז מסיימים את הפקודה עם הפרמטרים של המתודה:

id serverConnection = [OCMockObject partialMockForObject:[ServerConnection sharedInstance]];
id filesManager = [OCMockObject partialMockForObject:[FilesManager sharedInstance]];
[[[serverConnection expect] andDo:^(NSInvocation *invocation) {
        void (^passedBlock)( BOOL );
        [invocation getArgument: &passedBlock atIndex: 4];
        NSData* data = [[NSData alloc] initWith:""];
        passedBlock(data);
    }]  getFromUrl:url withTimeout:12.f onCompletion:OCMOCK_ANY];
[[filesManager expect] saveFile: OCMOCK_ANY];
[filesManager verify];
[serverConnection verify];
 
[filesManager stopMocking];
[serverConnection stopMocking];
Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *