一次åˆä¸€æ¬¡åœ°åœ¨é¡¹ç›®ä¸ç”¨Mockå†™æµ‹è¯•ï¼Œæ¯æ¬¡éƒ½æ˜¯æ— å¥ˆå’Œä¸æƒ…愿。
对è¯ä¸€
Me: 为什么è¦ç”¨Mock呢?
Dev: å› ä¸ºå®¢æˆ·è¦æ±‚åªæœ‰Modelä¸çš„ä»£ç æ‰èƒ½touchæ•°æ®åº“。
Me:Â æž„é€ æ•°æ®åšå…¶ä»–å±‚æ¬¡çš„æµ‹è¯•è€Œä¸æ˜¯mock,这ä¸å¯ä»¥å—?
Dev:Â â€¦æµ‹è¯•æ•°æ®æž„é€ å¾ˆéº»çƒ¦ã€‚æˆ‘ä»¬ç”¨Mock分离其ä¾èµ–层次的代ç ï¼Œè¿™æ ·å°±å¯ä»¥ä¸“å¿ƒå†™å½“å‰æ–¹æ³•的测试了。
Me: ä¾èµ–的低层次方法全都Mockäº†ç†æƒ³è¿”回值,接下æ¥ç›´æŽ¥æ–言结果就好了?高层次的测试过了但低层的å而没过ï¼
Dev: ……Mock䏿˜¯ä¿è¯äº†å„层ä¾èµ–的方法真的被调用了嘛。
Me: 产å“代ç 里我能看è§è°è¢«è°ƒç”¨ï¼Œå¯ä»£ç 集æˆåŽç»“果到底对ä¸å¯¹å‘¢ï¼Ÿé›†æˆæµ‹è¯•在哪呢,怎么知é“产å“ä»£ç æ”¾åœ¨ä¸€èµ·çœŸèƒ½work?
Dev: ………Cucumber测试……
Me: Holy crap!
ä½ åº”æ‡‚å¾—ï¼š
- Mock应该作为分离模å—和模å—之间的手段,以é™ä½Žæµ‹è¯•的难度,例如Mockæ•°æ®æŸ¥è¯¢ï¼Œè¿”å›žè‡ªå·±æž„é€ çš„æµ‹è¯•æ•°æ®è€Œä¸æ˜¯è®¿é—®æ¨¡å—之外的资æºã€‚
- 模å—内的层次之间的关è”åœ¨æµ‹è¯•ä¸æœªå¿…éžè¦ç”±Mock打æ–,在一定数æ®çš„基础之上,为一个原å功能åšè·¨è¶Šä¸€äºŒä¸ªç±»çš„å•元测试,更能从集æˆçš„è§’åº¦è¯æ˜Žä»£ç çš„æ£ç¡®æ€§ã€‚
- æ¯”è¯æ˜Žâ€œæŸäº›ä¾èµ–ç¡®å®žè¢«è°ƒç”¨åˆ°â€æ›´æœ‰æ„ä¹‰çš„æ˜¯è¯æ˜Žâ€œå¯¹ç»™å®šçš„输入数æ®èƒ½å¾—出期待的结果â€ã€‚ä¸è¦æŠŠåŸºäºŽç»“æžœæ–è¨€çš„æµ‹è¯•å˜æˆç”¨Mockæè¿°å®žçŽ°è¿‡ç¨‹ã€‚
- 如果已ç»çŸ¥é“是delegate方法到其他方法上,那就çœäº†Mock的测试å§ï¼Œå°±åƒæ‹¿ç€æ ‡å‡†ç”案ç”è€ƒé¢˜ï¼Œè¿‡å®¶å®¶ä¸€æ ·æ¯«æ— æ„义,除éžä½ ä¸å¹¸è¦å®Œæˆå˜æ€ä¸”愚昧的“100%测试覆盖率â€ã€‚
- 如果对“æŸå±‚次代ç 能å¦é—´æŽ¥è®¿é—®åˆ°æ•°æ®åº“â€æ²¡æœ‰è‹›åˆ»è¦æ±‚,那么有必è¦çš„è¯ï¼Œå¯ä¸ºæ¯ä¸ªå¼€å‘机器é…置独立数æ®åº“,并区分开testæ•°æ®åº“å’Œdevelopmentæ•°æ®åº“,让testæ•°æ®åº“åªè·‘æµ‹è¯•ã€‚è¿™æ ·åœ¨å†™è®¿é—®æ•°æ®ç›¸å…³çš„æµ‹è¯•时,就å¯å¤§èƒ†é¢„置测试数æ®ï¼Œä¹‹åŽæ¸…除也方便,让测试能够“所è§å³æ‰€å¾—â€ä»Žè€Œæ›´åŠ çœŸå®žã€‚
对è¯äºŒ
Me: Mock的代ç 这么多,还对应ç€äº§å“代ç 里的实现细节,这ä¸å®¹æ˜“写更ä¸å®¹æ˜“看懂啊ï¼
Dev: 这也ä¸ç®—å¤šï¼Œæž„é€ æµ‹è¯•æ•°æ®æ‰éº»çƒ¦å‘¢ã€‚è¢«æµ‹æ–¹æ³•é‡Œè°ƒçš„å…¶ä»–å¯¹è±¡æ–¹æ³•ä½ ä¸å¾—ä¸Mock啊,ä¸ç„¶ä¼šæŠ¥é”™ã€‚
Me: 但是我è¦ç”¨æµ‹è¯•æ¥é©±åЍ开å‘啊,这ä¸é—´çš„细节我需è¦åˆ°çœŸæ£å†™å‡ºäº§å“ä»£ç æ—¶æ‰èƒ½ç¡®å®šï¼Œè¿™æ ·çš„æµ‹è¯•也太难写了å§ï¼Ÿ
Dev: …是有点麻烦,ä¸ç„¶ä½ 先写好æ–言部分,产å“代ç éœ€è¦æ—¶å†è¡¥ä¸ŠMockå§ã€‚
Me: 这是先开å‘åŽè¡¥æµ‹è¯•啊ï¼
Dev:Â â€¦â€¦ä¸€ç‚¹ä¸€ç‚¹å†™çš„â€¦æœ€ç»ˆåæ£æ˜¯æœ‰æ•ˆçš„æµ‹è¯•å•¦ã€‚
Me: 如果被Mockçš„æ–¹æ³•è¢«æ›´æ”¹äº†å®žçŽ°å‘¢ï¼Œä½ èƒ½åŠæ—¶å‘现å—?测试全过了å¯åº”用å¯åЍå´åºŸäº†ï¼Œè¿™äº‹å‘生过å§ï¼Ÿ
Dev:Â â€¦â€¦â€¦æ”¹ä»£ç æ—¶ç»†å¿ƒä¸€ç‚¹ï¼Œå¤šæœç´¢ä¸‹æ£€æŸ¥æ£€æŸ¥ï¼Œå¯åŠ¨åº”ç”¨çœ‹ä¸€çœ‹â€¦â€¦
Me: Holy crap!
ä½ åº”æ‡‚å¾—ï¼š
- Mock在测试ä¸å¿…然会构建å‡è®¾ï¼Œé€šå¸¸å¦‚“æŸç±»çš„æŸæ–¹æ³•åœ¨æŸæ¡ä»¶ä¸‹è°ƒç”¨æ—¶åº”返回æŸç»“æžœâ€ã€‚åº”è¯¥å°†å…¶æŽ§åˆ¶åˆ°æ‰€æµ‹åŠŸèƒ½çš„æ•°æ®æºå¤´å¤„ï¼Œè€Œä¸æ˜¯ä»»å…¶æ³›æ»¥æˆä¸ºå®žçŽ°è¿‡ç¨‹åœ¨æµ‹è¯•ä¸çš„æè¿°ã€‚
- Mockçš„å‡è®¾åœ¨æè¿°æ—¶å¿…然会牵扯到所测方法的实现细节,这在一定程度上为先写测试åŽå†™ä»£ç å¢žåŠ äº†éš¾åº¦ã€‚
- 过多地使用Mock会é™ä½Žæµ‹è¯•代ç çš„å¯è¯»æ€§ï¼Œæ›´é‡è¦çš„æ˜¯å…¶å¯ç»´æŠ¤æ€§ã€‚错误的å‡è®¾ä¸æ˜“åˆ†è¾¨ï¼Œå› ä¸ºçœŸå®žæ”¹å˜æ—¶å‡è®¾è¿˜ä¿æŒä¸å˜ï¼Œæ— 法通过测试的失败而被å‘çŽ°ï¼Œè€Œä»£ç æ£€æŸ¥ã€é›†æˆæµ‹è¯•以åŠäººå·¥æµ‹è¯•æˆä¸ºäº†ä»£ä»·æ˜‚è´µçš„è¡¥å¿æ–¹æ³•。