¼ò½é
ÔÚÀíÏëÇé¿öÏ£¬ÄãËù×öµÄËùÓвâÊÔ¶¼ÊÇÄÜÓ¦¶ÔÄãʵ¼Ê´úÂëµÄ¸ß¼¶²âÊÔ¡£ÀýÈ磬UI ²âÊÔ½«Ä£Äâʵ¼ÊµÄÓû§ÊäÈ루Klaas
ÔÚËûµÄÎÄÕÂÖÐÓÐÌÖÂÛ£©µÈµÈ¡£Êµµ«¼ÊÉÏ£¬Õâ²¢·ÇÓÀÔ¶¶¼ÊǸöºÃÖ÷Ò⡣Ϊÿ¸ö²âÊÔÓÃÀý¶¼·ÃÎÊÒ»´ÎÊý¾Ý¿â»òÕßÐýתһ´Î
UI »áʹÄãµÄ²âÊÔÅܵ÷dz£Âý£¬Õâ»á½µµÍÄãµÄÉú²úÁ¦£¬²¢µ¼ÖÂÄ㲻ȥ¾³£ÅÜÄÇЩ²âÊÔ¡£ÈôÄã²âÊÔµÄij¶Î´úÂëÒÀÀµÓÚÍøÂçÁ¬½Ó£¬Õâ»áÒªÇóÄãµÄ²âÊÔ»·¾³¾ß±¸ÍøÂç½ÓÈëÌõ¼þ£¬¶øÇÒÕâÒ²ÄÑÒÔÄ£ÄâÄ³Ð©ÌØÊâµÄ²âÊÔ£¬±ÈÈçµ±µç»°´¦ÓÚ·ÉÐÐģʽÇé¿öϵÄʱºò¡£
ÕýÒòÈç´Ë£¬ÎÒÃÇ¿ÉÒÔÓÃһЩģÄâ´úÂëÌæ»»ÄãµÄʵ¼Ê´úÂëÀ´±àдһЩ²âÊÔÓÃÀý¡£
ʲôʱºòÄã»áÐèÒªÓõ½Ò»Ð©Ä£Äâ (mock) ¶ÔÏóÄØ£¿
ÈÃÎÒÃÇ´ÓÒÔÏÂÕâЩ²»Í¬ÀàÐ͵ÄÄ£Äâ¶ÔÏóµÄ»ù±¾¶¨Ò忪ʼ¡£
double ¿ÉÒÔÀí½âΪÖû»£¬ËüÊÇËùÓÐÄ£Äâ²âÊÔ¶ÔÏóµÄͳ³Æ£¬ÎÒÃÇÒ²¿ÉÒÔ³ÆËüÎªÌæÉí¡£Ò»°ãÀ´Ëµ£¬µ±Äã´´½¨ÈÎÒâÒ»ÖÖ²âÊÔÖû»¶ÔÏóʱ£¬Ëü½«±»ÓÃÀ´Ìæ´úij¸öÖ¸¶¨ÀàµÄ¶ÔÏó¡£
stub ¿ÉÒÔÀí½âΪ²âÊÔ×®£¬ËüÄÜʵÏÖµ±Ìض¨µÄ·½·¨±»µ÷ÓÃʱ£¬·µ»ØÒ»¸öÖ¸¶¨µÄÄ£ÄâÖµ¡£Èç¹ûÄãµÄ²âÊÔÓÃÀýÐèÒªÒ»¸ö°éÉú¶ÔÏóÀ´ÌṩһЩÊý¾Ý£¬¿ÉÒÔʹÓÃ
stub À´È¡´úÊý¾ÝÔ´£¬ÔÚ²âÊÔÉèÖÃʱ¿ÉÒÔÖ¸¶¨·µ»ØÃ¿´ÎÒ»ÖµÄÄ£ÄâÊý¾Ý¡£
spy ¿ÉÒÔÀí½âΪÕì²é£¬Ëü¸ºÔð»ã±¨Çé¿ö£¬³ÖÐø×·×Ùʲô·½·¨±»µ÷ÓÃÁË£¬ÒÔ¼°µ÷Óùý³ÌÖд«µÝÁËÄÄЩ²ÎÊý¡£ÄãÄÜÓÃËüÀ´ÊµÏÖ²âÊÔ¶ÏÑÔ£¬±ÈÈçÒ»¸öÌØ¶¨µÄ·½·¨ÊÇ·ñ±»µ÷ÓûòÕßÊÇ·ñʹÓÃÕýÈ·µÄ²ÎÊýµ÷Óᣵ±ÄãÐèÒª²âÊÔÁ½¸ö¶ÔÏó¼äµÄijЩÐÒé»òÕß¹ØÏµÊ±»á·Ç³£ÓÐÓá£
mock Óë spy ÀàËÆ£¬µ«ÔÚʹÓÃÉÏÓÐЩÐí²»Í¬¡£spy ×·×ÙËùÓеķ½·¨µ÷Ó㬲¢ÔÚʺóÈÃÄãд¶ÏÑÔ£¬¶ø
mock ͨ³£ÐèÒªÄãÊÂÏÈÉ趨ÆÚÍû¡£Äã¸æËßËüÄãÆÚÍû·¢Éúʲô£¬È»ºóÖ´ÐвâÊÔ´úÂë²¢ÑéÖ¤×îºóµÄ½á¹ûÓëÊÂÏȶ¨ÒåµÄÆÚÍûÊÇ·ñÒ»Ö¡£
fake ÊÇÒ»¸ö¾ß±¸ÍêÕû¹¦ÄÜʵÏÖºÍÐÐΪµÄ¶ÔÏó£¬ÐÐΪÉÏÀ´ËµËüºÍÕâ¸öÀàÐ͵ÄÕæÊµ¶ÔÏóÉÏÒ»Ñù£¬µ«²»Í¬ÓÚËüËùÄ£ÄâµÄÀ࣬Ëüʹ²âÊÔ±äµÃ¸ü¼ÓÈÝÒס£Ò»¸öµäÐ͵ÄÀý×ÓÊÇʹÓÃÄÚ´æÖеÄÊý¾Ý¿âÀ´Éú³ÉÒ»¸öÊý¾Ý³Ö¾Ã»¯¶ÔÏ󣬶ø²»ÊÇÈ¥·ÃÎÊÒ»¸öÕæÕýµÄÉú²ú»·¾³µÄÊý¾Ý¿â¡£
ʵ¼ùÖУ¬ÕâЩÊõÓï³£³£ÓÃÆðÀ´²»Í¬ÓÚËüÃǵ͍Ò壬ÉõÖÁ¿ÉÒÔ»¥»»¡£ÉÔºóÎÒÃÇÔÚÕâÆªÎÄÕÂÖлῴµ½Ò»Ð©¿â£¬ËüÃÇ×ÔÈÏΪ×Ô¼ºÊÇ
"mock ¶ÔÏó¿ò¼Ü"£¬µ«ÊÇÆäʵËüÃÇÒ²Ìṩ stub µÄ¹¦ÄÜ£¬¶øÇÒÑéÖ¤ÐÐΪµÄ·½Ê½Ò²ÀàËÆÓÚÎÒÃèÊöµÄ
"spy" ¶ø²»ÊÇ "mock"¡£ËùÒÔ²»ÒªÌ«¹ýÓÚÏÝÈëÕâЩ´Ê»ãµÄϸ½Ú£»ÎÒÏÂÕâЩ¶¨Òå¸ü¶àµÄÊÇÒòΪҪÔڸ߲ã´ÎÉÏÇø·ÖÕâЩ¸ÅÄ²¢ÇÒËü¶Ô¿¼ÂDz»Í¬ÀàÐͲâÊÔ¶ÔÏóµÄÐÐΪ»áÓаïÖú¡£
Èç¹ûÄã¶Ô²»Í¬ÀàÐ͵ÄÄ£Äâ²âÊÔ¶ÔÏó¸ü¶àµÄϸ½ÚÌÖÂÛ¸ÐÐËȤ£¬Martin Fowler µÄÎÄÕ "Mocks
Aren't Stubs" ±»ÈÏΪÊǹØÓÚÕâ¸öÎÊÌâµÄȨÍþÌÖÂÛ¡£
Ä£ÄâÖ÷ÒåÕß (Mockists) vs. ͳ¼ÆÖ÷ÒåÕß (Statists)
Ðí¶à¹ØÓÚÄ£Äâ¶ÔÏóµÄÌÖÂÛÖ÷ÒªÊÇÑÜÉú×Ô Fowler µÄÎÄÕµģ¬ËüÃÇÌÖÂÛÁËÁ½ÖÖ²»Í¬ÀàÐ͵ijÌÐòÔ±£¬Ä£ÄâÖ÷ÒåÕߺÍͳ¼ÆÖ÷ÒåÕߣ¬ËùдµÄ²âÊÔ¡£
Ä£ÄâÖ÷ÒåµÄ·½Ê½ÊDzâÊÔ¶ÔÏóÖ®¼äµÄ½»»¥¡£Í¨¹ýʹÓÃÄ£Äâ¶ÔÏó£¬Äã¿ÉÒÔ¸üÈÝÒ×µØÑéÖ¤±»²â¶ÔÏóÊÇ·ñ×ñÑÁËËüÓëÆäËûÀàÒѽ¨Á¢µÄÐÒ飬ʹµÃÔÚÕýÈ·µÄʱ¼ä·¢ÉúÕýÈ·µÄÍⲿµ÷Ó᣶ÔÓÚÄÇЩʹÓÃÐÐΪÇý¶¯
(behavior-driven) µÄ¿ª·¢ÕßÀ´Ëµ£¬ÕâÖÖ²âÊÔ¿ÉÒÔÇý¶¯³ö¸üºÃµÄÉú²ú´úÂ룬ÒòΪÄãÐèÒªÃ÷È·Ä£Äâ³öÌØ¶¨µÄ·½·¨£¬Õâ¿ÉÒÔ°ïÄãÉè¼Æ³öÔÚÁ½¸ö¶ÔÏóÖ®¼äʹÓõĸüÓÅÑŵÄAPI£¬ÕâÖÖÏë·¨ÓëÄ£ÄâÇý¶¯½ôÃÜÁªÏµÔÚÒ»Æð¡£Òò´ËÄ£ÄâÖ÷ÒåµÄ²âÊÔ¸üÆ«ÏòÓÚµ¥Ôª¼¶±ðµÄ²âÊÔ£¬¶ø²»ÊÇÍêÈ«µÄ¶Ëµ½¶Ë
(end-to-end) ²âÊÔ¡£
ͳ¼ÆÖ÷ÒåµÄ·½Ê½ÊDz»Ê¹ÓÃÄ£Äâ¶ÔÏó¡£ÕâÖÖ˼·ÊDzâÊÔʱֻ²âÊÔ״̬¶ø²»ÊÇÐÐΪ£¬Òò´ËÕâÖÖÀàÐ͵IJâÊÔ¸ü¼Ó½¡×³¡£Ê¹ÓÃÄ£Äâ²âÊÔʱ£¬Èç¹ûÄã¸üÐÂÁËʵ¼ÊÀàµÄÐÐΪ£¬Ä£ÄâÀàÒ²ÐèҪͬ²½¸üУ»Èç¹ûÄãÍüÁËÕâô×ö£¬Äã¿ÉÄÜ»áÓöµ½²âÊÔ¿ÉÒÔͨ¹ýµ«ÊÇ´úÂëÈ´²»ÄÜÕýÈ·¹¤×÷µÄÇé¿ö¡£Í¨¹ýÇ¿µ÷ÔÚ²âÊÔ»·¾³ÖÐֻʹÓÃÄÇÐ©ÕæÕýµÄ´úÂ룬ͳ¼ÆÖ÷ÒåµÄ²âÊÔ¿ÉÒÔ°ïÖúÄã¼õÉÙ²âÊÔ´úÂëºÍʵÏÖ´úÂëµÄñîºÏ¶È£¬²¢½µµÍ³ö´íÂÊ¡£ÕâÖÖÀàÐ͵IJâÊÔ£¬Äú¿ÉÄÜÒѾ²Âµ½£¬ÊʺÏÓÚ¸üÈ«ÃæµÄ¶Ëµ½¶ËµÄ²âÊÔ¡£
µ±È»£¬²¢²»ÊÇ˵ÓÐÁ½¸ö¶ÔÁ¢µÄ³ÌÐòԱѧÅÉ£»Äã²»¿ÉÄÜ¿´µ½Ä£ÄâÖ÷ÒåºÍͳ¼ÆÖ÷ÒåµÄµ±½Ö¶Ô¾ö¡£ÕâÖÖ·ÖÆçÊÇÓÐÓõ쬵«ÊÇ£¬µÃÈÏʶµ½
mock ÔÚÓÐЩʱºòÊÇÄãµÄ¹¤¾ßÏäÀï×îºÃµÄ¹¤¾ß£¬µ«ÊÇÓÐʱºòÓÖ²»ÊÇ¡£²»Í¬ÀàÐ͵IJâÊÔÊÊÓÃÓÚ²»Í¬µÄÈÎÎñ£¬²¢ÇÒ×î¸ßЧµÄ²âÊÔÌ×¼þÍùÍùÊDz»Í¬²âÊÔ·ç¸ñµÄ¼¯ºÏÌå¡£×Ðϸ¿¼ÂÇÄãµ½µ×ÏëÒªÓõ¥¸ö²âÊÔÀ´Ñé֤Щʲô£¬ÕâÄܰïÖúÄãÕÒµ½×îºÏÊʵIJâÊÔ·½Ê½£¬¶øÇÒÄܰïÄã¾ö¶¨¶ÔÓÚµ±Ç°¹¤×÷À´Ëµ£¬Ê¹ÓÃÄ£Äâ²âÊÔ¶ÔÏóÊÇ·ñÊÇÕýÈ·µÄ¹¤¾ß¡£
ÉîÈë´úÂë
ÀíÂÛÉÏ̸ÆðÀ´ËùÓÐÒ»Çж¼Ã»Ê²Ã´ÎÊÌ⣬µ«ÈÃÎÒÃÇÀ´¿´Ò»¸öÄãÐèÒªÓõ½ mock µÄÕæÊµÓÃÀý¡£
ÈÃÎÒÃÇÊÔ×ŲâÊÔÒ»¸ö¶ÔÏó£¬ËüÉÏÃæÓÐÒ»¸ö·½·¨£¬ÊÇͨ¹ýµ÷Óà UIApplication µÄ openURL:
·½·¨À´´ò¿ªÁíÍâÒ»¸öÓ¦ÓóÌÐò¡£(ÕâÊÇÎÒÔÚ²âÊÔÎÒµÄ IntentKit ¿âʱÓöµ½µÄÒ»¸öÕæÊµÎÊÌâ¡£) ¸øÕâ¸öÓÃÀýдһ¸ö¶Ëµ½¶ËµÄ²âÊÔ£¬¾ÍËãÊÇÓпÉÄÜ×öµ½£¬Ò²ÊǷdz£À§Äѵģ¬ÒòΪ
'³É¹¦×´Ì¬' ±¾Éíµ¼ÖÂÁËÓ¦ÓóÌÐòµÄ¹Ø±Õ¡£×ÔÈ»µÄÑ¡ÔñÊÇ£¬Ä£Äâ³öÒ»¸ö UIApplication ¶ÔÏ󣬲¢ÑéÖ¤Õâ¸öÄ£Äâ¶ÔÏóÊÇ·ñȷʵµ÷ÓÃÁË
openURL ·½·¨´ò¿ªÕýÈ·µÄ URL¡£
¼ÙÉèÕâ¸ö¶ÔÏóÓÐÕâÑùµÄ·½·¨£º
@interface AppLinker
: NSObject
- (instancetype)initWithApplication:(UIApplication
*)application;
- (void)doSomething:(NSURL *)url;
@end |
ÕâÊÇÒ»¸ö·Ç³£Ç£Ç¿µÄÀý×Ó£¬µ«ÊÇÇëÈÝÈÌÎÒһϡ£ÔÚÕâ¸öÀý×ÓÖУ¬Äã»á×¢Òâµ½ÎÒÃÇʹÓÃÁ˹¹Ôì·½·¨½øÐÐ×¢È룬µ±ÎÒÃÇ´´½¨
AppLinker µÄ¶ÔÏóʱ½« UIApplication ¶ÔÏó×¢Èëµ½ÆäÖС£´ó²¿·ÖÇé¿öÏ£¬Ê¹ÓÃÄ£Äâ¶ÔÏóÒªÇóʹÓÃijÖÖÐÎʽµÄÒÀÀµ×¢Èë¡£Èç¹ûÕâ¸ö¸ÅÄî¶ÔÄãºÜİÉú£¬ÇëÒ»¶¨¿´¿´±¾ÆÚµÄ
Jon µÄÎÄÕ ÖеÄÃèÊö¡£
OCMockito
OCMockito ÊÇÒ»¸ö·Ç³£ÇáÁ¿¼¶µÄʹÓÃÄ£Äâ¶ÔÏóµÄ¿â£º
UIApplication
*app = mock([UIApplication class]);
AppLinker *linker = [AppLinker alloc] initWithApplication:app];
NSURL *url = [NSURL urlWithString:@"https://google.com"];
[linker doSomething:URL];
[verify(app) openURL:url]; |
OCMock
OCMock ÊÇÁíÒ»¸ö Objective-C µÄÄ£Äâ¶ÔÏó¿â¡£ºÍ OCMockito ÀàËÆ£¬ËüÌṩÁ˹ØÓÚ
stub ºÍ mock µÄËùÓй¦ÄÜ£¬²¢ÇÒ°üÀ¨ÁËÄã¿ÉÄÜÐèÒªµÄÒ»Çй¦ÄÜ¡£Ëü±È OCMockito µÄ¹¦ÄܸüÇ¿£¬ÒÀÀµÓÚÄãµÄ¸öÈËÑ¡Ôñ£¬¸÷ÓÐÀû±×¡£
ÔÚ×î»ù±¾²ãÃæÉÏ£¬ÎÒÃÇ¿ÉÒÔʹÓà OCMock À´ÖØÐ´³öÓë֮ǰ·Ç³£ÀàËÆµÄ²âÊÔ£º
id app = OCMClassMock([UIApplication
class]);
AppLinker *linker = [AppLinker alloc] initWithApplication:app];
NSURL *url = [NSURL urlWithString:@"https://google.com"];
[linker doSomething:url];
OCMVerify([app openURL:url]); |
ÕâÖÖÔÚÄã²âÊÔºóÔÙÑéÖ¤µ÷Ó÷½·¨µÄÄ£Äâ²âÊÔ·ç¸ñ±»ÈÏΪÊÇÒ»ÖÖ ¡°ÔËÐкóÑéÖ¤¡± µÄ·½Ê½¡£OCMock Ö»ÔÚ×î½ü
3.0 °æ±¾ºóÔö¼ÓÁ˶Ըù¦ÄܵÄÖ§³Ö¡£Í¬Ê±ËüÒ²Ö§³ÖÀϰ汾µÄ·ç¸ñ£¬¼´¶ÔÆÚÍûÔËÐеÄÑéÖ¤£¬ÔÚÖ´ÐвâÊÔ´úÂëǰÏÈÉ趨¶Ô²âÊÔ½á¹ûµÄÆÚÍû¡£×îºó£¬ÄãÖ»ÐèÒªÑéÖ¤ÆÚÍûºÍʵ¼Ê½á¹ûÊÇ·ñ¶ÔÓ¦£º
id app = OCMClassMock([UIApplication
class]);
AppLinker *linker = [AppLinker alloc] initWithApplication:app];
NSURL *url = [NSURL urlWithString:@"https://google.com"];
OCMExpect([app openURL:url]);
[linker doSomething:url];
OCMVerifyAll(); |
ÓÉÓÚ OCMock Ò²Ö§³Ö¶ÔÀà·½·¨µÄ stub£¬ÄãÒ²¿ÉÒÔÓÃÕâÖÖ·½Ê½À´²âÊÔ£¬Èç¹û doSomething
·½·¨Í¨¹ý [UIApplication sharedApplication] À´ÊµÏÖ¶ø²»ÊÇ UIApplication
¶ÔÏóµÄ×¢Èë³õʼ»¯£º
id app = OCMClassMock([UIApplication
class]);
OCMStub([app sharedInstance]).andReturn(app);
AppLinker *linker = [AppLinker alloc] init];
NSURL *url = [NSURL urlWithString:@"https://google.com"];
[linker doSomething:url];
OCMVerify([app openURL:url]); |
Äã»á·¢ÏÖ stub Àà·½·¨ºÍ stub ʵÀý·½·¨¿´ÆðÀ´ÊÇÒ»ÑùµÄ¡£
¹¹½¨Äã×Ô¼ºµÄ²âÊÔ
¶ÔÓÚÏñÕâÖÖ¼òµ¥µÄÓÃÀý£¬ÄãÒ²Ðí²»ÐèÒªÕâÃ´ÖØÁ¿¼¶µÄÄ£Äâ¶ÔÏó²âÊԿ⡣ͨ³££¬ÄãÖ»ÐèÒª´´½¨Äã×Ô¼ºµÄÄ£Äâ¶ÔÏóÀ´²âÊÔÄã¹ØÐĵÄÐÐΪ£º
@interface FakeApplication
: NSObject
@property (readwrite, nonatomic, strong) NSURL
*lastOpenedURL;
- (void)openURL:(NSURL *)url;
@end
@implementation FakeApplication
- (void)openURL:(NSURL *)url {
self.lastOpenedURL = url;
}
@end |
ÒÔÏÂÊDzâÊÔ£º
FakeApplication
*app = [[FakeApplication alloc] init];
AppLinker *linker = [AppLinker alloc] initWithApplication:app];
NSURL *url = [NSURL urlWithString:@"https://google.com"];
[linker doSomething:url];
XCAssertEqual(app.lastOpenedURL, url, @"Did
not open the expected URL"); |
¶ÔÓÚÀàËÆÕâ¸öÒѾÉè¼ÆºÃµÄÀý×Ó£¬¾Í¿ÉÄÜ»á³öÏÖÕâÖÖÇé¿ö£¬´´ÔìÄã×Ô¼ºµÄÄ£Äâ¶ÔÏóÖ»ÊÇÔö¼ÓÁ˺ܶ಻±ØÒªµÄÑù°å£¬µ«Èç¹ûÄã¾õµÃÐèҪģÄâ¸üΪ¸´ÔӵĶÔÏó½»»¥£¬ÄÇôÍêÈ«¿ØÖÆÄ£Äâ¶ÔÏóµÄÐÐΪ¾Í»á·Ç³£ÓмÛÖµ¡£
ʹÓÃÄÄÒ»¸ö£¿
Ñ¡ÔñÄÄÒ»ÖÖ·½°¸ÍêÈ«ÒÀÀµÓÚÄãµÄ¾ßÌå²âÊÔÇé¿öÒÔ¼°ÄãµÄ¸öÈËÆ«ºÃ¡£OCMockito ºÍ OCMock ¶¼¿ÉÒÔͨ¹ý
CocoaPods °²×°£¬½«ËüÃǼ¯³Éµ½ÄãÏÖÓеIJâÊÔ»·¾³¶¼·Ç³£¼òµ¥£¬µ«ÐèҪעÒâµÄÊÇ£¬³ý·ÇÄãÐèÒª£¬·ñÔò±ÜÃâÐÂÔöһЩÆäËûµÄÒÀÀµ¡£ÁíÍâ³ý·ÇÕæµÄÐèÒª£¬×îºÃ¾Í¶¼´´½¨Ò»Ð©¼òµ¥µÄÄ£Äâ¶ÔÏó¡£
Ä£Äâ²âÊÔʱµÄ×¢ÒâÊÂÏî
ÔÚÈκÎÐÎʽµÄ²âÊÔÖÐÄãÓпÉÄÜÅöµ½µÄ×î´óµÄÎÊÌâÖ®Ò»ÊÇдµÄ²âÊÔºÍʵÏÖ´úÂëñîºÏ¹ýÓÚ½ôÃÜ¡£²âÊÔÖÐÒ»¸ö×îÖØÒªµÄ¹Ø¼üµãÊǽµµÍδÀ´µÄ±ä»¯Ëù´øÀ´µÄ³É±¾£»Èç¹û¸Ä±ä´úÂëµÄʵÏÖϸ½ÚÆÆ»µÁ˵±Ç°µÄ²âÊÔ£¬ÔòÕâÖֳɱ¾ÒѾÔö¼ÓÁË¡£Ò²¾ÍÊÇ˵£¬ÆäʵΪÁË×îС»¯ÓÉÓÚʹÓÃÄ£Äâ²âÊÔËùÔì³É²»ÀûÓ°Ï죬ÆäʵÄãÓкܶà¿ÉÒÔ×öµÄ¡£
ÒÀÀµ×¢ÈëÊÇÄãµÄºÃ»ï°é
Èç¹ûÄ㻹ûÓÐʹÓÃÒÀÀµ×¢È룬»òÐíÄã»áÐèÒªËü¡£ËäÈ»ÓÐʱºò²»Ê¹ÓÃÒÀÀµ×¢ÈëÀ´Ä£Äâ¶ÔÏóÒ²ÊÇ¿ÉÒÔµÄµÄ (±ÈÈçÒÔÉÏÃæÊ¹ÓÃ
OCMock Ä£ÄâÀà·½·¨)£¬µ«ÊÇͨ³£ÊDz»Ì«¿ÉÄܵġ£¼´Ê¹¿ÉÄÜ£¬ÉèÖòâÊÔËùÒýÈëµÄ¸´ÔÓ¶ÈÒ²¿ÉÄÜ´óÓÚËüÄÜ´øÀ´µÄºÃ´¦¡£Èç¹ûÄãʹÓÃÒÀÀµ×¢ÈëµÄ»°£¬Äã»á·¢ÏÖʹÓÃ
stub ºÍ mock ·½Ê½Ð´²âÊÔÒªÈÝÒ׵Ķࡣ
²»ÒªÄ£ÄâÄãûÓеÄ
Ðí¶àÓоÑéµÄ²âÊÔÈËÔ±¶¼»á¾¯¸æÄã¡°²»ÒªÄ£ÄâÄãûÓеĶ«Î÷¡±£¬Òâ˼ÊÇÄãÓ¦¸ÃֻΪÄã´úÂë¿â±¾ÉíÓµÓеĶÔÏó´´½¨
mock »ò stub£¬¶ø²»ÊÇΪµÚÈý·½ÒÀÀµ»òһЩ¿âÈ¥´´½¨¡£ÕâÀïÖ÷ÒªÓÐÁ½¸öÔÒò£¬Ò»¸öÊÇ»ùÓÚʵ¼ÊÇé¿öµÄ£¬Ò»¸öÊǸü¾ßÓÐÕÜѧÐԵĿ¼ÂÇ¡£
¶ÔÓÚÄãµÄ´úÂë¿â£¬Äã¶ÔËü²»Í¬½Ó¿ÚµÄÎȶ¨ÐԺͲ»Îȶ¨ÐÔ´ó¸Å»áÓÐÒ»¸ö¸Ð¾õ£¬ËùÒÔÄã¿ÉÒÔͨ¹ýÄãµÄÖ±¾õÀ´ÅжÏʹÓÃÌæ»»²âÊԵķ½·¨ÊDz»ÊÇ¿ÉÄܻᵼÖ²âÊÔ¹ýÓÚ´àÈõ¡£Ò»°ãÀ´Ëµ£¬Äã¶ÔµÚÈý·½´úÂëûÓÐÕâÑùµÄ°ÑÎÕ¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬һ¸öͨÓõÄ×ö·¨ÊÇΪµÚÈý·½´úÂë´´½¨°ü×°ÀàÀ´³éÏó³öËüµÄÐÐΪ¡£ÔÚijЩÇé¿öÏ£¬½ö½öÊÇ×ªÒÆ¸´ÔÓÐÔ¶ø²»ÊǽµµÍ¸´ÔÓÐÔÍùÍùÊÇûʲôÒâÒåµÄ¡£µ«ÊÇÔÚһЩÇé¿öÏ£¬Äã»áºÜ¾³£Ê¹ÓÃÄãµÄµÚÈý·½´úÂ룬ÕâʱÕâ¾ÍÊÇÒ»¸ö¾«¼òÄã²âÊԵĺ÷½·¨¡£ÄãµÄµ¥Ôª²âÊÔÄÜÄ£Äâ³ö×Ô¶¨Òå¶ÔÏ󣬲¢Ê¹Óø߲ã´ÎµÄ¼¯³É»ò¹¦ÄܲâÊÔÀ´²âÊÔÄãµÄ°ü×°Àà±¾Éí¡£
iOS ºÍ OS X ¿ª·¢ÊÀ½çµÄΨһÐÔµ¼ÖÂÁËÊÂÇéÉÔ΢¸´ÔÓһЩ¡£ÎÒÃÇ×öµÄºÜ¶àÊÂÇé¶¼ÒÀÀµÓÚ Apple
µÄ¿ò¼Ü£¬Õâ¸ö¿ò¼ÜÔ¶Ô¶³¬¹ýÁËÆäËûÓïÑÔµÄһЩ±ê×¼¿â¡£ËäÈ» NSUserDefaults ²»ÊÇÒ»¸ö¡°ÄãÓµÓС±¶ÔÏ󣬵«ÊÇ£¬Èç¹ûÄã·¢ÏÖÄãÓÐÐèÒª°ÑËüÄ£Äâ³öÀ´£¬ÄǾͷÅÐÄÈ¥×ö°É£¬Æ»¹û²»Ì«¿ÉÄÜ»áÔÚδÀ´µÄ
Xcode µÄ°æ±¾ÖÐÍÆ³ö´òÆÆÕâ¸ö API µÄ±ä»¯¡£
ÁíÒ»¸ö²»ÒªÄ£ÄâµÚÈý·½ÒÀÀµ¿âµÄÔÒò¸ü¾ßÕÜѧÐÔ¡£Ê¹ÓÃÄ£ÄâÖ÷Òå·ç¸ñÊéд²âÊԵIJ¿·ÖÔÒòÊÇͨ¹ýÕâÑùµÄ²âÊÔÄܱȽÏÈÝÒ×µÄÕÒµ½Á½¸ö¶ÔÏó¼ä×îÇåÎú¿ÉÐеĽӿڡ£µ«ÊÇÈç¹ûÊǵÚÈý·½ÒÀÀµ£¬ÄãÎÞ·¨¶ÔÆä½øÐпØÖÆ£»API
ÐÒéÖеÄһЩÏêϸÐÅÏ¢ÒѾ±»µÚÈý·½¿â¶¨ËÀÁË£¬ËùÒÔÄãÎÞ·¨Í¨¹ý²âÊÔÀ´Í¨¹ýʵÑéÓÐЧµØÑéÖ¤½Ó¿ÚÊÇ·ñÓиĽøµÄÓàµØ¡£Õâ±¾Éí²»ÊÇÎÊÌ⣬µ«ÔںܶàÇé¿öÏ£¬Ëü½µµÍÁËÄ£Äâ²âÊÔµÄЧ¹û£¬Ö±µ½°ÑÄ£Äâ²âÊÔµÄÓŵãĨɱ´ù¾¡¡£
²»ÒªÄ£·ÂÎÒ£¡
²âÊÔûÓÐÒøµ¯£»»ùÓÚÄãµÄ¸öÈËÇãÏòºÍ´úÂëµÄ¾ßÌåÌØÐÔ£¬²»Í¬µÄÇé¿öÏÂÐèҪʹÓò»Í¬µÄ²ßÂÔ¡£²âÊÔÌæÉí¿ÉÄܲ»ÊÊÓÃËùÓеÄÇé¿ö£¬µ«ËüÃÇ»áÊÇÄã²âÊÔ¹¤¾ßÏäÖÐÒ»¸ö·Ç³£ÓÐЧµÄ¹¤¾ß¡£²»¹ÜÄãÇãÏòÓÚʹÓÿò¼ÜÔÚµ¥Ôª²âÊÔÖÐÄ£Äâ³öÒ»ÇУ¬»¹ÊÇÖ»ÊǸù¾ÝÐèÒª´´½¨Äã×Ô¼ºµÄÄ£Äâ¶ÔÏ󣬵±Äã˼¿¼ÈçºÎ²âÊÔÄãµÄ´úÂëʱ£¬ÀμÇÄ£Äâ¶ÔÏóÊǷdz£ÓÐÒâÒå¡£ |