当前位置: 首页 > Web前端 > HTML5

第12集:从零开始实现一套pc端VueUI组件库(jest单元测试)

时间:2023-04-06 00:00:40 HTML5

绗?2闆嗭細浠庨浂寮€濮嬪疄鐜帮紙jest鍗曞厓娴嬭瘯锛?.鑱婅亰娴嬭瘯杩欐鍜屽ぇ瀹惰亰鑱婂垎浜拰浣犱竴璧峰涔犳祴璇曟椂鍋氱殑绗旇鍜屾垜鍦ㄨ繖涓」鐩腑鍋氱殑涓€浜涙祴璇曘€傚墠绔唬鐮佺殑鍗曞厓娴嬭瘯鍜岄泦鎴愭祴璇曪紝椋庨洦鍏肩▼銆傚緢澶氫汉涓€鎻愬埌瀹冨氨璇磋繖鏄ソ浜嬨€傝闂湁鍑犲鍏徃鐨刅ue椤圭洰涓ユ牸瑕佹眰璺戝崟鍏冩祴璇曞拰闆嗘垚娴嬭瘯锛熸祴璇曞け璐ユ槸鍚︽殏鍋滃彂灏勶紵闄や簡澶у叕鍙革紝寰堝皯鏈変汉鑳藉仛鍒般€傛瘯绔燂紝澶у鏁板叕鍙稿彧璁╀笓涓氱殑娴嬭瘯鍥㈤槦鏉ュ仛銆備汉鑲夎瘯楠?銆傜幇鍦ㄧ殑鍓嶇绯荤粺濡傛搴炲ぇ锛屽洿缁曞墠绔紑鍙戠殑鎶€鏈拰鐭ヨ瘑鐐瑰眰鍑轰笉绌凤紝鏇翠綍鍐靛悇绉嶆妧鏈箣闂寸殑绾犺憶涓嶆柇琚壀銆佷贡銆傚惉鍒版湁浜鸿锛氣€滄垜鍙兂鎶婂墠绔唬鐮佸啓濂斤紝鍏朵粬鐨勪笉绠¤涓嶈鈥濓紝杩欏彞璇濇槸涓€鍙ョ儌璇濓紝杩欎簺鏉備竷鏉傚叓鐨勬妧鏈篃鏄墠绔妧鏈紝濡傛灉浣犲彧鑳藉啓浣犳墍璋撶殑鈥樺墠绔唬鐮佲€欙紝閭d綘鐪熺殑鍙兘娲讳竴杈堝瓙鈥欏垵瀛﹁€呪攽(锟P旓浚)鈹嶃€傝繖涓ぇ瀹堕兘璁ゅ悓锛屼絾鏄负浠€涔堝ぇ瀹朵笉鐢ㄥ憿锛燂紵锛燂紵锛燂紵锛燂紵锛燂紵鎺ヤ笅鏉ワ紝鎴戜滑灏嗗垪鍑哄畠鐨勪紭鐐瑰拰缂虹偣銆?.浼樼己鐐圭己鐐瑰墠绔祴璇曟妧鏈綋绯诲皻鏈舰鎴愩€傝繖濂梪i浣跨敤jest涓巚ue-cli闆嗘垚銆傜湡鐨勪笉濂界敤銆傛湁涓€瀹氱殑瀛︿範鎴愭湰銆傛垜闈㈣瘯杩囧緢澶?骞翠互涓婄粡楠岀殑浜猴紝杩炶璁℃ā鍨嬫垜閮戒笉鎳傦紝鏇村埆璇磋浠栧娴嬭瘯浜嗐€傘€傘€傚彲鏈夊彲鏃犵殑鎯呭喌锛屽緢澶氶」鐩兘娌℃湁寰堝ソ鐨勮瘯杩愯锛屼絾鏄粬浠啓浜嗗緢澶歜ug鍜屼笉鎯宠繘姝ョ殑浜猴紝涓嶈灏忕湅杩欎竴鐐癸紝寰堝鎶€鏈汉鍛樹細鍒堕€犲悇绉嶇悊鐢憋紝涓嶆兂璺冲嚭鑸掗€傚尯銆傛瘡娆℃洿鏀归渶姹傛垨浼樺寲浠g爜锛岄兘闇€瑕佹洿鏀逛袱浠戒唬鐮侊紝鑰楄垂澶ч噺浜哄姏銆傚ソ澶勬槸澶氫簡涓€涓€濈淮缁村害锛屽浜嗕竴涓妧鏈繚闅滀釜浜烘潵璇达紝瀵逛簬鎯抽潬鎶€鏈吇瀹剁硦鍙g殑浜烘潵璇达紝杩欎竴鐐逛篃寰堥噸瑕併€備繚鎶や富瑕侀€昏緫鐨勬祦鐣呮€э紝鏁村娴嬭瘯閮藉彲浠ヨ窇寰楁病鏈夊お澶氶敊璇痓绾ч珮锛岃鍒汉鏀惧績浣跨敤浣犵殑涓滀笢锛岃繖涔熸槸纭疄鍔?.鐢ㄩ€斿拰鍒嗙被澶ц嚧鍒嗗垎涓轰袱绫伙細BDD鎶婃墍鏈夌殑閫昏緫閮藉啓鍑烘潵锛岀劧鍚庢牴鎹綘鐨勬暣浣撻€昏緫鍒跺畾浣犵殑娴嬭瘯銆傚ソ澶勫綋鐒舵槸绠€鍗曟槗鎳傦紝鎬濊矾鏇村叏闈€傜己鐐规槸瑕嗙洊鐜囦綆锛屼笉澶畨鍏ㄣ€俆DD缂栧啓娴嬭瘯鐒跺悗寮€鍙戙€傝繖绉嶆ā寮忛潪甯告湁瓒c€傚厛鍐欐祴璇曪紝涔熷氨鏄厛鍦ㄨ剳娴烽噷鏁翠綋甯冨眬锛屾瘡涓€姝ラ兘鎯冲ソ浜嗗啀鍋氥€傛祴璇曡鐩栫巼鍙兘鏄?00%锛屽畠鐨勭己鐐瑰お鏄庢樉浜嗐€傚紑鍙戜汉鍛樺繀椤绘槸鐔熺粌鐨勶紝濡傛灉闇€姹傛敼鍙樹簡鈥︹€︽湁浜哄繖銆傚熀鏈笂寤虹珛鎴戞槸鍦╲ue椤圭洰涓洿鎺ラ€夋嫨鐨刯est娴嬭瘯銆傛湁鍗曠嫭瀹為獙鐨勬湅鍙嬪彲浠ュ畨瑁卬pmijest-D閰嶇疆"scripts":{"test":"jest--watchAll"}锛屽湪鍛戒护琛岃繍琛宯pmruntest銆備絾鏄鏋滅數鑴戣繍琛屾椂娌℃湁杩欎釜鍛戒护锛屽彲浠ヤ娇鐢╪px鎴栬€呭叏灞€瀹夎銆傚鏋滄槸es椤圭洰锛岄渶瑕侀泦鎴恘pmi@babel/core@babel/preset-env-Djest鍐呯疆浜嗗babel鐨勪緷璧栵紝浠栫湅鍒?babelrc鏃讹紝浼氫娇鐢╦est閰嶅悎鍩烘湰瑙f瀽銆傚畠浼氳嚜鍔ㄦ壘鍒皒x.test.js鏂囦欢銆傞厤缃涓嬶紝鎮ㄥ彲浠ュ皢鍏朵慨鏀逛负鎮ㄥ枩娆㈢殑璇箟銆俥lement-ui浣跨敤瑙勮寖銆傝繖涓枃浠跺彲浠ラ€氳繃銆俲estinit鐢熸垚jest.config.jstestMatch:['**/tests/unit/**/*.(spec|test).(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'],//1:鏈€澶栧眰鐨刣escribe鐩稿綋浜庝竴涓ぇ鐨刾arentcontainerbox锛屾妸test鍒嗘垚'blocks'//鍑洪敊鐨勬椂鍊欙紝console浼氭姤鍛婃槸鍝釜block'Somethingwent閿欒describe('Button鐩稿叧浠g爜',()=>{//2:'灏忓潡'娴嬭瘯鍗曞厓锛岄拡瀵规煇浜涜亴璐e叿浣撴祴璇?test('娴嬭瘯鎸夐挳鐐瑰嚮灏忎汉',()=>{//3:Assertion锛屼篃灏辨槸鐪熸鍒ゆ柇鏌愪簺鍊兼槸鍚︽纭殑涓€涓楠xpect(1).toBe(1);});});浠ヤ笂闈负渚?/鎰忔€濇槸鍒ゆ柇1鏄惁涓?==1expect(1).toBe(1);//鐢辨鍙expect鍑芥暟璐熻矗鎺ユ敹瑕佹祴璇曠殑鍊?/toBe灏辨槸鎵€璋撶殑===锛岃窡閲岄潰鐨勫€兼瘮杈冧竴涓?/鏃㈢劧鏈?==锛岄偅鑲畾浼氭湁鏇村鐨勫垽鏂被鍨?/浠栫殑瀛﹀悕鏄痗onfigurator銆傚悇绫?configurator'toEqual涓嶆槸==銆備弗鏍兼潵璇存槸蹇界暐寮曠敤锛屽彧姣旇緝鍐呭锛屽唴閮ㄤ及璁℃槸搴忓垪鍖栫殑锛屾墍浠a:1}.toEqual({a:1})truetoBeFalsy鍙互杞负falsetoBeTruthy鍙互杞负truetoBeUndefinedisundefinedtoBeDefinedisnotundefinedtoBeNull===nullnotflip淇グ绗︼紝expect(1).not.toBe(2);1涓嶆槸2toBeGreaterThanOrEqual(3)澶т簬绛変簬3toBeLessThanOrEqual(3)灏忎簬绛変簬3toBeLessThan(3)灏忎簬3toBeGreaterThan(3)澶т簬3'abc'銆倀oMatch('b')//鏄惁鍖呭惈瀛楃涓?b'锛屽彲浠ュ啓姝e垯鐢熷懡鍛ㄦ湡beforeEach(()=>{//willexecutemebeforeeachtestexecution});afterEach(()=>{//鎴戜細鍦ㄦ瘡涓祴璇曟墽琛屽畬涔嬪悗鎵ц});beforeAll(()=>{//鎴戜細鍦ㄦ墍鏈夋祴璇曟墽琛屽畬涔嬪墠鎵ц});afterAll(()=>{//I浼氬湪鎵€鏈夋祴璇曟墽琛屽畬姣曞悗鎵ц});describe('鎸夐挳鐩稿叧浠g爜',()=>{test('娴嬭瘯鎸夐挳鐐瑰嚮灏忎紮',()=>{expect(1).toBe(1);});});杩欎釜鏃朵唬鎵€鏈夋彃浠剁殑閰嶇疆閮借秼鍚戜簬鈥滃姛鑳藉寲鈥濅箣涓婄殑鐢熷懡鍛ㄦ湡鍔熻兘锛岄潪甯稿鍚堣璁℃ā寮忥紝鎴戜滑鍦ㄥ啓椤圭洰鐨勬椂鍊欎篃鍙互鍊熼壌銆傜湅瀹屼笂闈㈡槸涓嶆槸瑙夊緱娴嬭瘯椤靛緢瀹规槗锛屽潙浜嗕互鍚庡啀缁撳悎vue椤圭洰銆?.vue鍐呴儴Vue褰撶劧鏄緢涓嶄竴鏍风殑锛屾覆鏌撴柟寮忎篃涓嶄竴鏍枫€傚垢杩愮殑鏄紝鏈塚ue鑷繁鐨勫洟闃熸彁渚涙敮鎸侊紝鍙互浠嬬粛Vue涓殑涓€浜涙蹇点€俶ount锛氫綘鍙互鐞嗚В鎴戠殑Vue涓疄渚嬪寲缁勪欢鐨勬柟娉曘€傚畼缃戣锛?CreateaWrappercontainingmountedandrenderedVuecomponents'锛屽嵆瀹屾暣鐨勬覆鏌撱€傚畠鐨勪紭鐐规槸瀹屽鎬э紝浣嗙己鐐逛篃鏄槑鏄剧殑浣庢晥鐜囥€係hallowMount涓巑ount鐩稿悓锛屽垱寤轰竴涓猈rapper锛屽寘鍚寕杞藉拰娓叉煋鐨勭粍浠禫ue缁勪欢鐨刉rapper涓嶅悓鐨勬槸锛岃瀛樻牴鐨勫瓙缁勪欢鍙槸鎸傝浇褰撳墠缁勪欢瀹炰緥锛涘寘瑁呭櫒鏄竴绉嶆柟娉曪紝鍖呮嫭宸插畨瑁呯殑缁勪欢鎴杤node浠ュ強娴嬭瘯缁勪欢鎴杤node鐨勬柟娉曘€傜洿瑙傛潵璇达紝灏辨槸涓撻棬鐢ㄦ潵娴嬭瘯鐨勪緥瀛愩€傜敱浜庣瘒骞呮湁闄愶紝鎴戝氨鐩存帴浣跨敤鎴戦」鐩腑鐨勪緥瀛愶紱鍏跺疄鎴戜篃涓嶆槸寰堟槑鐧借娴嬭瘯浠€涔堬紝鎵€浠ュ氨涓惧嚑涓畝鍗曠殑渚嬪瓙锛屽ぇ瀹朵竴璧峰涔狅紝涓€璧疯璁恒€侭utton缁勪欢鎸夐挳娴嬭瘯vue-cc-ui/tests/unit/Button.test.js//shallowMount鏄疈vue/test-utils瀹樻柟鎻愪緵鐨勬祴璇曞伐鍏穒mport{shallowMount}from'@vue/test-utils';importButtonfrom'../../src/components/Button';//杩欎釜鏄弬鑰冪綉涓婂寘鑾峰彇dom鐨勬柟娉曪紝涓嬮潰浼氳瑙p煈噄mport{findTestWrapper}from'../utils/util';describe('娴嬭瘯鎸夐挳缁勪欢',()=>{it('1:鎸夐挳缁勪欢鍙互娓叉煋',()=>{//浣跨敤shallowMount瀹炰緥鍖栨垜鐨勬寜閽粍浠禼onstwrapper=shallowMount(Button);//鍏抽敭瀛梒ontains锛屽垽鏂璚rapper涓槸鍚﹀寘鍚尮閰嶉€夋嫨鍣ㄧ殑鍏冪礌鎴栫粍浠躲€?/鍗虫垜鎯冲垽鏂寜閽粍浠舵覆鏌撳悗椤甸潰涓婃槸鍚︾湡鐨勬湁鎸夐挳鍏冪礌銆俥xpect(wrapper.contains('button')).toBe(true);});it('2:鐐瑰嚮鎸夐挳缁勪欢鏃朵細瑙﹀彂鐐瑰嚮浜嬩欢',()=>{//杩樻槸鍏堟覆鏌揷onstwrapper=shallowMount(鎸夐挳锛?//鎵惧埌鎸夐挳瀹炰緥锛岃繖閲屾槸at(0)锛岀被浼间簬涓€涓暟缁刐0]锛沜onstbutton=findTestWrapper(wrapper,'button').at(0);//鍦ㄦ寜閽笂瑙﹀彂瀹冪殑鐐瑰嚮鏂规硶button.trigger('click');//emitted:杩斿洖鍖呭惈鐢盬rappervm瑙﹀彂鐨勮嚜瀹氫箟浜嬩欢鐨勫璞°€?/涔熷氨鏄洃鍚〉闈㈡槸鍚﹁Е鍙戜簡this.$emit('click')浜嬩欢//toBeTruthy涓婇潰鎴戜滑宸茬粡鎻愬埌浜唀xpect(wrapper.emitted().click).toBeTruthy();});it('3:浼犲叆icon鍙傛暟锛屽彲浠ユ樉绀哄浘鏍囩粍浠?,()=>{//shallowMount鍒濆鍖栨椂锛屽彲浠ヤ紶鍏ュ弬鏁?/涓嬮潰鐨勬搷浣滃ぇ瀹堕兘鐭ラ亾constwrapper=shallowMount(Button,{propsData:{icon:'cc-up'}});//鎵惧埌杩欎釜鍥炬爣鍏冪礌consticon=findTestWrapper(wrapper,'icon').at(0);//鎴戜紶瀹屽浘鏍囧悗锛屽浘鏍囩粍浠跺繀椤诲瓨鍦╡xpect(icon).toBeTruthy();});});涓婇潰鐨勪緥瀛愭彁鍒颁簡涓€涓叕鍏辨柟娉曘€傝鎴戣В閲娿€俥xportconstfindTestWrapper=(wrapper,tag)=>{returnwrapper.findAll(`[data-test="${tag}"]`);};鎴戜滑鍦ㄥ啓浠g爜鐨勬椂鍊欙紝涓轰簡鏂逛究浠ュ悗鐨勬祴璇曪紝鎴戜滑杩樹細娣诲姞涓€浜涙祴璇曞睘鎬э紝姣斿涓嬮潰鐨?divdata-test='name'>{{name}}}

value:findTestWrapper(wrapper,'name')findAll鏄痺rapperbody涓婄殑涓€涓柟娉曪紝瀵瑰簲鐨勮繕鏈塮indtofindonlyoneinputboxtestimport{shallowMount}from'@vue/test-utils';importInputfrom'../../src/components/Input';import{findTestWrapper}from'../utils/util';describe('娴嬭瘯鎸夐挳缁勪欢',()=>{it('1:鍙互娓叉煋杈撳叆缁勪欢',()=>{//杩欐槸涓€涓熀鏈楠onstwrapper=shallowMount(Input);鏈熸湜锛堝寘瑁呭櫒銆傚寘鍚紙'杈撳叆'锛夛級銆倀oBe锛堢湡锛夛紱});it('2:杈撳叆鍊间笌鏄剧ず鍐呭鐩稿悓锛屼慨鏀硅仈鍔?,()=>{//娴嬭瘯鏄惁鍙屽悜缁戝畾constwrapper=shallowMount(Input,{propsData:{value:'content1'}});//鑾峰彇杈撳叆妗嗗疄渚媍onstinput=findTestWrapper(wrapper,'input').at(0);//鍏冪礌鐩存帴鍙栧埌dom...杩欎釜dom涔熶笉鏄痙om//value鍙互妯℃嫙鍙栧嚭鏄剧ず鍊糴xpect(input.element.value).toBe('Content1')//鏀瑰彉涔熶細鏀瑰彉wrapper.setProps({value:'Content2'})//鍙浠栦滑涓€璧锋敼鍙橈紝婊¤冻瑕佹眰expect(input.element.value).toBe('Content2')});//鎴戠殑杈撳叆妗嗘槸娓呴櫎鍑芥暟it('3:娓呴櫎鍐呭鎸夐挳鏈夋晥',()=>{constwrapper=shallowMount(Input,{propsData:{value:'Content1',clear:true}});//鍙湁鍦╤over鏃舵墠浼氬嚭鐜?!//杩欐槸缁勪欢鍐呴儴鐨勮Е鍙戞潯浠讹紝setData鍙互寮鸿鏀瑰彉缁勪欢鍐呴儴鐨刣ata鏁版嵁wrapper.setData({hovering:true})constclear=findTestWrapper(wrapper,'clear').at(0);//杩欓噷涔熸彁鍒皌oBeTruthy鍙互鍒ゆ柇鏄惁鍙互鍙樹负true//鍗宠繖涓畾涔夌殑瀹炰緥鏄惁瀛樺湪expect(clear).toBeTruthy();//瑙﹀彂娓呴櫎浜嬩欢clear.trigger('click');鏈熸湜锛坵rapper.emitted锛堬級銆傝緭鍏ワ級銆倀oBeTruthy锛堬級锛泒);it('4:浼犲叆icon鍙傛暟锛屽彲浠ユ樉绀哄浘鏍囩殑Component',()=>{constwrapper=shallowMount(Input,{propsData:{icon:'cc-up'}});consticon=findTestWrapper(wrapper,'icon').at(0);expect(icon).toBeTruthy();});it('5:switchtype,textboxappears',()=>{constwrapper=shallowMount(Input,{propsData:{type:'textarea'}});consttextarea=findTestWrapper(wrapper,'textarea').鍦紙0锛夛紱鏈熸湜锛坱extarea锛?toBeTruthy锛堬級锛泒锛夛紱}锛夛紱娴嬭瘯鍒嗛〉鍣ㄤ粠'@vue/test-utils'瀵煎叆{shallowMount}锛涗粠'../../src/components/Pagination'瀵煎叆鍒嗛〉锛涗粠'../utils/util'瀵煎叆{findTestWrapper}锛涙弿杩帮紙'娴嬭瘯pager缁勪欢',()=>{it('1:椤甸潰鍙互娓叉煋Wrapper缁勪欢',()=>{constwrapper=shallowMount(Pagination,{propsData:{pageTotal:5,value:1}});//classes杩斿洖WrapperDOM鑺傜偣鐨勭被杩斿洖涓€涓被鍚嶆暟缁勩€傛垨鑰呭湪鎻愪緵绫诲悕鏃惰繑鍥炰竴涓竷灏斿€笺€傝繖鎰忓懗鐫€杩欎釜dom鐨勭被鏄?cc-pagination'expect(wrapper.classes()).toContain('cc-pagination');});it('2:浼犲叆1000椤碉紝鏄剧ず1000椤?,()=>{constwrapper=shallowMount(Pagination,{propsData:{pageTotal:1000,pageSize:1000,value:1}});constli=findTestWrapper(wrapper,'item');//鎴戝緱鍒颁簡杩欎釜鍏冪礌1000expect(li.length).toBe(1000);});it('3:鐐瑰嚮绗笁椤佃烦杞埌绗笁椤?,()=>{constwrapper=shallowMount(Pagination,{propsData:{pageTotal:10,pageSize:10,value:1}});wrapper.vm.handlClick(3)//鍙戦€佷簨浠秂xpect(wrapper.emitted().input).toBeTruthy();//鍙戦€佷簨浠跺弬鏁帮紝娉ㄦ剰鏄暟缁勫舰寮?/this鍙戦€佺殑绗竴涓弬鏁颁簨浠禰0]expect(wrapper.emitted().input[0]).toEqual([3])});});娴嬭瘯涔熷簲璇ユ湁寰堝鑷繁鐨勬兂娉曘€傛病鏈夊皾璇曡繃鐨勬湅鍙嬩笉濡ㄨ瘯涓€璇曘€傞厤缃腑娌℃湁鎻愬埌锛氬惎鐢ㄥ疄鏃舵娴?test:unit":"vue-cli-servicetest:unit--watch",//鏃犺鏄惁鏇存敼锛岄兘鐩戞帶鎵€鏈夋枃浠?test:unit":"vue-cli-servicetest:unit--watchAll",鎰忔€濇槸ui缁勪欢绔泦鍚堜笉鍐欐祴璇曚笉杩囷紝鍦ㄤ互寰€鐨勫啓浣滆繃绋嬩腑锛屼篃閬囧埌杩囦笉灏戝潙銆傛瘮濡傚祵濂楀湪slot涓殑涓や釜缁勪欢锛屼袱鑰呴兘鏈?蹇呴€夊弬鏁?鐨勯檺鍒躲€俈ue骞舵病鏈夊緢濂界殑瑙e喅杩欎釜闂銆傛枃妗g湅浜嗗崐澶╋紝鎰熻鏈夌敤鐨勪笢瑗垮お灏戜簡銆傝繖涓嶅彲鑳芥槸鐜扮姸銆傚笇鏈涙祴璇曠浉鍏崇殑鎶€鏈敮鎸佽秺鏉ヨ秺瀹屽杽銆傚ぇ瀹跺彲浠ヤ竴璧蜂氦娴侊紝涓€璧峰涔狅紝涓€璧疯繘姝ワ紝鏃╂棩瀹炵幇鑷垜浠峰€硷紒!椤圭洰github鍦板潃锛氶摼鎺ヨ鏄庝釜浜烘妧鏈崥瀹紙ui瀹樼綉锛夛細閾炬帴璇存槑

最新推荐
猜你喜欢