娴佽妗嗘灦鐨勬祴璇曞伐鍏峰姣旓細Mocha銆丣est鍜孞asmine銆傝繖涓変釜宸ュ叿閮芥槸鍩轰簬鏂█鍑芥暟锛坅ssertionfunctions锛夋潵甯姪鎴戜滑澧炲姞娴嬭瘯鐨勫彲璇绘€у拰鍙墿灞曟€э紝鍚屾椂涔熸敮鎸佹垜浠簡瑙f祴璇曡繘搴﹀苟鐢熸垚鏈€缁堢殑娴嬭瘯缁撴灉鎶ュ憡浠ヤ簡瑙d唬鐮佽鐩栫巼銆傛渶灏忓崟鍏冩祴璇曢鍏堟垜浠渶瑕佸畨瑁呭熀浜嶯ode鍜孨PM鐨凧est銆傛偍鍙互鍦ㄧ粓绔腑杩愯浠ヤ笅鍛戒护鏉ユ煡鐪嬫槸鍚﹀凡瀹夎Node鍜孨PM銆傚鏋滆繑鍥炵浉鍏崇増鏈俊鎭紝鍒欒瘉鏄庤繖涓や釜宸ュ叿宸茬粡瀛樺湪銆俙node-vnpm-v`鎺ヤ笅鏉ワ紝鎴戜滑闇€瑕佸啀娆″畨瑁匤est锛屽湪缁堢涓紝鎴戜滑鍙互浣跨敤浠ヤ笅鍛戒护瀹夎Jest銆傚叏灞€鏍囧織鍏佽鎴戜滑鐩存帴浠庡懡浠よ瀹㈡埛绔紙渚嬪缁堢鎴栧懡浠ゆ彁绀虹锛夎繍琛孞est娴嬭瘯銆傚湪npminstalljest--global涓嬶紝鍋囪鎴戜滑瑕佺紪鍐欎竴涓枑娉㈤偅濂戞暟鍒楀嚱鏁般€傛牴鎹祴璇曢┍鍔ㄧ殑鎬濊矾锛屾垜浠鍏堝垱寤轰竴涓猣ib.test.js娴嬭瘯鏂囦欢锛屽叾涓寘鍚涓嬫祴璇曠敤渚嬶細濡傛灉鎴戜滑杈撳叆7锛岄偅涔堟枑娉㈤偅濂戞暟鍒楃殑缁撴灉搴旇鏄?3銆倀est('7鐨勬枑娉㈤偅濂戠粨鏋滄槸13',()=>{鏈熸湜(fib(7,0,1)).toBe(13);});閫氳繃涓嬮潰鐨勫懡浠わ紝鎴戜滑鍙互杩愯涓婇潰鐨勬祴璇曡剼鏈細jestfib.test.js姝ゆ椂锛屽鏋滄垜浠繍琛屼笂闈㈢殑娴嬭瘯锛岀粨鏋滆偗瀹氫細鎶ラ敊銆傚洜涓烘鏃讹紝鎴戜滑杩樻病鏈変负鏂愭尝閭e鏁板垪鍒涘缓鍑芥暟锛佹墍浠ヨ繖涓€姝ュ氨鏄垜浠孩缁块噸鏋勭殑绾㈣壊閮ㄥ垎銆傝嚦姝わ紝鎴戜滑鐭ラ亾涓轰簡閫氳繃娴嬭瘯锛屼笅涓€姝ュ氨鏄垱寤烘枑娉㈤偅濂戝嚱鏁般€傛垜浠彲浠ュ涓嬪垱寤轰竴涓苟灏嗗叾淇濆瓨鍦╢ib.js涓€傚湪杩欎釜鏂囦欢鐨勬湯灏撅紝鎴戜滑杩涜浜嗘ā鍧楀寲瀵煎嚭锛屼互渚挎垜浠彲浠ュ湪鍒氬垰鍒涘缓鐨勬祴璇曟枃浠朵腑瀵煎叆鍜屽紩鐢ㄥ畠銆俧unctionfib(n,lastlast,last){if(n==0){杩斿洖lastlast;}if(n==1){鏈€鍚庤繑鍥烇紱}returnfib(n-1,last,lastlast+last);}module.exports=fib;涔嬪悗锛屾垜浠彲浠ュ鍏ュ墠闈㈢敤渚嬩腑鐨凢ibonacci鍑芥暟銆倂arfib=require('./fib');test('7鐨勬枑娉㈤偅濂戠粨鏋滄槸13',()=>{expect(fib(7,0,1)).toBe(13);});褰撴垜浠€氳繃鍓嶉潰鐨勫懡浠ゅ啀娆¤繍琛屼笂闈㈢殑鏂囦欢鏃讹紝灏卞彲浠ョ湅鍒颁紶閫掔殑缁撴灉浜嗐€備篃灏辨槸璇达紝绾㈢豢閲嶅缓涓殑缁胯壊銆傚洜涓鸿繖鏄竴涓瘮杈冪畝鍗曠殑娴嬭瘯锛屾垜浠笉闇€瑕侀噸鏋勶紝鎵€浠ュ綋鎵ц鍒拌繖閲岀殑鏃跺€欙紝鎴戜滑鍙互鎶婂畠褰撲綔涓€涓祴璇曘€傛暟鎹€肩被鍨嬬殑鍖归厤鍦ㄦ暟鎹被鍨嬮偅涓€璁蹭腑锛屾垜浠皥鍒颁簡JavaScript璧嬪€间腑涓€浜涘父瑙佺殑闄烽槺锛屾瘮濡傚€兼瘮杈冨拰涓ユ牸姣旇緝杩斿洖鐨勭粨鏋滄槸涓嶄竴鏍风殑锛岃€屼笖闄や簡甯冨皵鍊间箣澶栵紝鍙兘杩樻湁涓€绉嶆暟鎹被鍨嬫槸杩斿洖鏃犲€笺€傛墍浠ュ湪娴嬭瘯鐨勬椂鍊欙紝杩樿娉ㄦ剰棰勬湡鐨勭粨鏋滃拰瀹為檯鐨勭粨鏋滄槸鍚﹀惢鍚堛€侸est鑷甫浜嗗緢澶氬唴缃殑鏂规硶鏉ュ府鍔╂垜浠繘琛屾暟鎹被鍨嬪尮閰嶃€傝鎴戜滑鏉ョ湅涓や釜渚嬪瓙銆傚湪绗竴涓緥瀛愪腑锛屾垜浠彲浠ョ湅鍒板綋鎴戜滑浣跨敤toEqual杩涜姣旇緝鏃讹紝undefined琚拷鐣ヤ簡锛屾墍浠ユ祴璇曞彲浠ラ€氳繃锛屼絾鏄綋鎴戜滑浣跨敤toStrictEqual鏃讹紝鎴戜滑鍙互鐪嬪埌涓ユ牸姣旇緝鐨勭粨鏋滐紝娴嬭瘯缁撴灉鏄け璐ョ殑銆傚湪绗簩涓緥瀛愪腑锛屾垜浠彲浠ョ湅鍒帮紝鐢变簬number鐨勫€煎彲浠ユ槸NaN锛岃繖鏄竴涓猣alsy鍊硷紝鎵€浠ユ祴璇曠殑缁撴灉鏄疨ass銆?/绀轰緥1test('checkequal',()=>{varobj={a:undefined,b:2}expect(obj).toEqual({b:2});});test('checkstrictequal',()=>{varobj={a:undefined,b:2}expect(obj).toStrictEqual({b:2});});//渚?test('checkfalsy',()=>{varnum=NaN;expect(num).toBeFalsy();});鎴戜滑鍦ㄤ笂涓€鑺傛枑娉㈤偅濂戜緥瀛愪腑浣跨敤鐨則oBe()鏄唬琛ㄦ瘮杈冪殑缁撴灉杩樻槸涓ユ牸姣旇緝鐨勭粨鏋滐紵鍏跺疄閮戒笉鏄紝toBe()浣跨敤鐨勬槸Object.is銆傞櫎浜唗oBeFasly锛屽叾浠栨祴璇曠湡鍊肩殑鏂规硶杩樻湁toBeNull()銆乼oBeUndefined()銆乼oBeDefined()鍜宼oBeTruthy()銆傚悓鏍凤紝鍦ㄤ娇鐢ㄥ畠浠椂锛屼竴瀹氳娉ㄦ剰瀹冧滑鐨勫疄闄呭惈涔夈€傞櫎浜嗕弗鏍肩殑姣旇緝鍜屽彇鍙嶄箣澶栵紝鎴戜滑鍦ㄦ暟鎹被鍨嬩腑璁插埌鐨勫彟涓€涓棶棰樺氨鏄痭umbers涓诞鐐规暟鐨勯棶棰樸€傚浜庤繖閬撻锛屾垜浠篃鍙互鐪嬪埌锛?.1鍔犱笂0.2锛屽氨鐭ラ亾涓嶆槸绛変簬0.3锛岃€屾槸绛変簬0.30000000000000004(0.3+4脳10鈭?7)銆傛墍浠xpect(0.1+0.2).toBe(0.3)鐨勭粨鏋滄槸澶辫触鐨勶紝濡傛灉鎴戜滑浣跨敤toBeCloseTo()锛屾垜浠彲浠ョ湅鍒癱lose缁撴灉鍙互閫氳繃娴嬭瘯銆傞櫎浜嗘瘮杈冪浉杩戠殑鏁板瓧锛孞est杩樻湁toBeGreaterThan()銆乼oBeGreaterThanOrEqual()銆乼oBeLessThan()鍜宼oBeLessThanOrEqual()鏂规硶鏉ュ府鍔╂垜浠瘮杈冨ぇ浜庛€佸ぇ浜庣瓑浜庛€佸皬浜庛€佸皬浜庣瓑浜庯紝杩欐牱鎴戜滑鍙互姣旇緝鍊笺€倀est('娣诲姞娴偣鏁?,()=>{varvalue=0.1+0.2;expect(value).toBe(0.3);//澶辫触});test('娣诲姞娴偣鏁?,()=>{varvalue=0.1+0.2;expect(value).toBeCloseTo(0.3);//閫氳繃});璇村畬鏁板瓧锛屽啀鏉ョ湅瀛楃涓插拰鏁扮粍銆傚湪浠ヤ笅涓や釜绀轰緥涓紝鎴戜滑鍙互浣跨敤姝e垯琛ㄨ揪寮忛€氳繃toMatch()鏉ユ祴璇曞瓧绗︿覆涓槸鍚﹀瓨鍦ㄥ崟璇嶃€傚悓鏍凤紝鎴戜滑鍙互浣跨敤toContain()鏉ユ煡鐪嬪厓绱犳槸鍚﹀湪鏁扮粍涓€倀est('涓栭棿鏈夌埍',()=>{expect('鎴戠埍鍔ㄧ墿').toMatch(/love/);});test('涓栭棿鏃犳仺',()=>{expect('鎴戠儹鐖卞拰骞筹紝涓嶅枩娆㈡垬浜?).not.toMatch(/hate/);});varnameList=['Lucy','Jessie'];test('Jessie鍦ㄥ垪琛ㄤ腑鍚?,()=>{expect(nameList).toContain('Jessie');});宓屽缁撴瀯娴嬭瘯鎺ヤ笅鏉ユ垜浠潵鐪嬪祵濂楃粨鏋勬祴璇曘€傛垜浠彲浠ュ皢涓€缁勬祴璇曚笌describe宓屽鍦ㄤ竴璧枫€傛瘮濡傛垜浠湁涓€涓煩褰㈢被锛屾祴璇曡繃绋嬪彲浠ュ祵濂楀涓嬨€傚湪澶栧眰锛屾垜浠弿杩颁簡鐭╁舰绫伙紱涓棿灞傛槸鐭╁舰闈㈢Н鐨勮绠楋紱鍐呭眰娴嬭瘯鍖呮嫭闀垮害鍜屽搴︾殑璁剧疆銆傞櫎浜嗗祵濂楃粨鏋勶紝鎴戜滑杩樺彲浠ヤ娇鐢╞eforeEach鍜宎fterEach鏉ヨ缃瘡缁勬祴璇曞墠鍚庣殑鍓嶅悗宸ヤ綔銆俤escribe('鐭╁舰绫?,()=>{describe('闈㈢Н璁$畻鏃?,()=>{test('璁剧疆瀹藉害',()=>{...});test('璁剧疆楂樺害',()=>{...});});});鍝嶅簲寮忓紓姝ユ祴璇曟垜浠杩囧緢澶氬墠绔祴璇曢兘鏄簨浠堕┍鍔ㄧ殑銆傚綋鎴戜滑璋堝埌寮傛缂栫▼鏃讹紝鎴戜滑涔熻皥鍒颁簡鍓嶇寮€鍙戙€備笉瑕佹墦寮€寮傛浜嬩欢銆傞偅涔堥€氬父娴嬭瘯宸ュ叿涔熶細瀵瑰紓姝ヨ皟鐢ㄧ殑娴嬭瘯鏈夌浉鍏崇殑鏀寔銆傝繕鏄互Jest涓轰緥锛屽畠鏀寔callback銆乸romise/then鍜屾垜浠彁鍒扮殑async/await銆傛帴涓嬫潵锛岃鎴戜滑璇︾粏浜嗚В涓€涓嬫瘡绉嶆ā寮忋€俢allbacktest('鏁版嵁鏄細浠锋牸鏄?1',done=>{functioncallback(error,data){if(error){done(error);return;}try{expect(data).toBe({price:21});done();}catch(error){done(error);}}fetchData(callback);});promise/then鍜宎sync/await//绀轰緥1锛歱romisethentest('鏁版嵁鏄細浠锋牸鏄?1',()=>{returnfetchData().then(data=>{expect(data).toBe({price:21});});});//绀轰緥2:asyncawaittest('Thedatais:priceFor21',async()=>{vardata=awaitfetchData();expect(data).toBe({浠锋牸:21});});Mock鍜孲tub娴嬭瘯Mock鍜孲tub鏄€氳繃鏇挎崲琚祴鍑芥暟涓殑Dependencies鏉ュ疄鐜扮殑銆傚畠浠殑鍖哄埆鍦ㄤ簬锛孲tub鏄竴绉嶆帴鍙o紝鏄墜鍔ㄦ浛鎹㈢殑锛岃€孧ock鏄噰鐢ㄥ嚱鏁版浛鎹㈢殑鏂瑰紡銆侻ock鍙互甯姪鎴戜滑妯℃嫙鏈夎繑鍥炲€肩殑鍑芥暟锛屾瘮濡備笅闈㈢殑myMock锛屽彲浠ユā鎷熶竴绯诲垪璋冪敤鐨勮繑鍥炵粨鏋溿€倂armyMock=jest.fn();console.log(myMock());//杩斿洖undefinedmyMock.mockReturnValueOnce(10).mockReturnValueOnce('x').mockReturnValue(true);console.log(myMock(),myMock(),myMock(),myMock());//return10,'x',true,true鍦ㄨ繖閲岋紝Jest浣跨敤浜嗘垜浠箣鍓嶅湪鍑芥暟寮忕紪绋嬩腑璁插埌鐨勫欢缁紶閫掗鏍硷紙CPS锛夛紝杩欐牱鍋氱殑濂藉鏄彲浠ュ府鍔╂垜浠敖鍙兘閬垮厤浣跨敤Stub銆傚瓨鏍圭殑瀹炵幇浼氭秹鍙婂埌澶ч噺鐨勬墜宸ュ伐浣滐紝鑰屼笖鐢变簬涓嶆槸鏈€缁堢殑鐪熷疄鎺ュ彛锛屾墜鍔ㄥ疄鐜扮湡瀹炴帴鍙g殑澶嶆潅閫昏緫涓嶄粎涓嶈兘淇濊瘉涓庡疄闄呮帴鍙g殑涓€鑷存€э紝杩樹細閫犳垚寰堝棰濆鐨勫紑鍙戞垚鏈€備娇鐢ㄥ熀浜嶤PS鐨凪ock鍙互鏇夸唬Stub锛岃妭鐪佷豢鐪熻繃绋嬩腑鐨勫伐浣滈噺銆倂arfilterTestFn=jest.fn();//绗竴娆¤繑鍥瀈true`锛涗箣鍚庤繑鍥瀈false`//杩斿洖[11]console.log(filterTestFn.mock.calls[0][0]);//杩斿洖11console.log(filterTestFn.mock.calls[1][0]);//杩斿洖12UI鑷姩鍖栨祴璇昲eadless娴忚鍣ㄥ拰鑷姩鍖栨祴璇昻pminstall--save-devjest-puppeteer{"preset":"jest-puppeteer"}describe('geektime',()=>{beforeAll(async()=>{awaitpage.goto('https://time.geekbang.org/');});it('Titleshouldbe"GeekbangTime-EasyLearning,EfficientLearning-GeekbangBang"',async()=>{awaitexpect(page.title()).resolves.toMatch('Google');});});鏈枃涓?鏈圖ay12鐨勫涔犵瑪璁帮紝鍐呭鏉ヨ嚜鏋佸鏃堕棿銆奐vascript杩涢樁瀹炴垬璇俱€嬶紝澶у涓€璧疯繘姝ヰ煉煉?/p>
