Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Öû»²âÊÔ: Mock, Stub ºÍÆäËû
 
À´Ô´£ºÍøÂç ·¢²¼ÓÚ£º 2017-9-15
  2522  次浏览      27
 

¼ò½é

ÔÚÀíÏëÇé¿öÏ£¬ÄãËù×öµÄËùÓвâÊÔ¶¼ÊÇÄÜÓ¦¶ÔÄãʵ¼Ê´úÂëµÄ¸ß¼¶²âÊÔ¡£ÀýÈ磬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£ÓÐÒâÒå¡£

   
2522 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù