vite + vue3.0使用jest測(cè)試初體驗(yàn)(二)

如何編寫一個(gè)實(shí)際項(xiàng)目的vue實(shí)例單元測(cè)試

最近一直苦惱怎么能跳過微信支付去測(cè)試之后的流程,后來想著單元測(cè)試可以跑通這個(gè)流程首量,而不需要手動(dòng)去點(diǎn)擊兄渺,全部都是以用戶模擬的方式進(jìn)行測(cè)試追城。
如果你還不知道如何在你的項(xiàng)目中加入jest,請(qǐng)參考我上一篇文章http://www.reibang.com/p/d29679cb6a3a捣域。

測(cè)試功能點(diǎn)描述

1. 用戶進(jìn)入頁面,根據(jù)是單獨(dú)購買還是拼團(tuán)購買來判斷價(jià)格是否正確琢岩。
    ```
    it('Is price right',() => {
        let expectedAmount = (mockData.activityInfo.leaderPrice / 100).toFixed(2);
        if(mockData.purchaseMethod === 'single'){
            // 是否為單獨(dú)購買
            expectedAmount = (mockData.couseInfo.price / 100).toFixed(2);
        }
        let price = wrapper.find('.price').text();
        expect(price).toBe(`訂單價(jià)格${expectedAmount}元`)
    })
    ```
2. 模擬用戶支付點(diǎn)擊流程(支付成功,失敗代碼可在完整代碼中查找)
    ```
        it('pay success',async () => {
            const payModalVisible = wrapper.vm.payModalVisible
            console.log(payModalVisible, '彈窗挽留狀態(tài)')
            // 觸發(fā)點(diǎn)擊事件
            await wrapper.find('.pay-btn').trigger('click');
            // 檢查微信支付之前的接口是否被調(diào)用
            expect(orderPayModel.getPayGroup).toHaveBeenCalledTimes(1);
            // 檢查是否正常埋點(diǎn)
            expect(sensors.track).toHaveBeenCalledTimes(1);
            // 檢查是否觸發(fā)了微信支付 且只允許調(diào)用一次
            expect(wrapper.vm.payNumber).toBe(1)
            // 檢查是否正常埋點(diǎn)
            expect(sensors.track).toHaveBeenCalledTimes(1);
            // 檢查微信失敗之后是否調(diào)起微信失敗挽留彈窗
            expect(wrapper.vm.payModalVisible).toBe(false)

            console.log(wrapper.vm.payModalVisible, '彈窗挽留狀態(tài)')

        });
    ```

完整代碼

/**
 *  jest 單元測(cè)試 拼團(tuán) panel組件
 *  檢查 支付是否成功
 * * */
import {mount} from '@vue/test-utils';
import PayPanel from '../src/components/course/pay/panel.vue';
import orderPayModel from '../src/model/orderPay';
import sensors from '../src/utils/sensors';

jest.mock('../src/model/orderPay');
// eslint-disable-next-line key-spacing
const wechatPayFetchGetData = {"data":{"nonce_str":"kzR1IFgHY3aaHM2f","orderId":"1448573147930529793","paymentId":"T021448573148714864641","teamId":"1448573153471205377","sign":"6DEB1B8F75C6A6948C1AFCEC89716698","trade_type":"JSAPI","sign_type":"MD5","prepay_id":"wx14165527393910ea57ec63b239d54c0000","timestamp":1634201727},"code":0,"message":""}
jest.mock('../src/model/orderPay', () => ({
    getPayGroup: jest.fn((params,callback) => {
        callback(wechatPayFetchGetData.data);
    })
}))

// 模擬微信支付失敗
let paySuccess = true;
// 模擬class
jest.mock('../src/model/wx', () => {
    return function(){
        return {
            pay: jest.fn((params,callback) => {
                callback(paySuccess)
            })
        }
    }
})

// 模擬神策埋點(diǎn)

jest.mock('../src/utils/sensors', () => ({
    track: jest.fn((eventName, data, callback) => {
        callback(true);
    }),
    webPage: jest.fn(( data, success) => {
        success(true);
    }),
    webClick: jest.fn((eventName, data, callback) => {
        callback(true);
    }),
}))
global.fetch = require('node-fetch');
global.sensors = null;


// 模擬組件props真實(shí)數(shù)據(jù) 可根據(jù)自己項(xiàng)目實(shí)際數(shù)據(jù)模擬投剥,因是公司的數(shù)據(jù)而無法展示
const mockData = {
    // eslint-disable-next-line key-spacing
    
}

// describe 定義個(gè)一個(gè)測(cè)套組件
describe('payPanel test', () => {
    // 掛載組建
    const wrapper = mount(PayPanel, {
        props: mockData
    })
    it('Is the closeButton trigger', () => {
        wrapper.find('.iconclose').trigger('click');
        // 是否有觸發(fā)emit onclose
        expect(wrapper.emitted()).toHaveProperty('onClose')
    })
    // 訂單價(jià)格是否正確
    it('Is price right',() => {
        let expectedAmount = (mockData.activityInfo.leaderPrice / 100).toFixed(2);
        if(mockData.purchaseMethod === 'single'){
            // 是否為單獨(dú)購買
            expectedAmount = (mockData.couseInfo.price / 100).toFixed(2);
        }
        let price = wrapper.find('.price').text();
        expect(price).toBe(`訂單價(jià)格${expectedAmount}元`)
    })
    // 參與團(tuán)員參團(tuán)類別要求是否展示正確
    it('Is the Group member type correct', () => {
        let typeText = mockData.activityInfo.type === 1 ? '僅限新人' : '新老不限';
        expect(wrapper.find('.type-member').text()).toBe(typeText)
        // expect(wrapper.find('.type-member1'))
    })
    // 檢查 單獨(dú)購買和拼團(tuán)是否正確
    it('Is the single pay correct', () => {
        let isSingle = mockData.purchaseMethod === 'single';
        expect(wrapper.find('.single-pay').exists()).toBe(isSingle)
    })
    // 測(cè)試一下正則 對(duì)比 tobe
    it('test regexp', () => {
        let x = new RegExp('aa');
        let y = new RegExp('aa');
        expect(x).toEqual(y)
    })
    // 支付成功
    it('pay success',async () => {
        const payModalVisible = wrapper.vm.payModalVisible
        console.log(payModalVisible, '彈窗挽留狀態(tài)')
        // 觸發(fā)點(diǎn)擊事件
        await wrapper.find('.pay-btn').trigger('click');
        // 檢查微信支付之前的接口是否被調(diào)用
        expect(orderPayModel.getPayGroup).toHaveBeenCalledTimes(1);
        // 檢查是否正常埋點(diǎn)
        expect(sensors.track).toHaveBeenCalledTimes(1);
        // 檢查是否觸發(fā)了微信支付 且只允許調(diào)用一次
        expect(wrapper.vm.payNumber).toBe(1)
        // 檢查是否正常埋點(diǎn)
        expect(sensors.track).toHaveBeenCalledTimes(1);
        // 檢查微信失敗之后是否調(diào)起微信失敗挽留彈窗
        expect(wrapper.vm.payModalVisible).toBe(false)

        console.log(wrapper.vm.payModalVisible, '彈窗挽留狀態(tài)')

    });
    // 支付失敗
    it('pay error',async () => {
        paySuccess = false;
        const payModalVisible = wrapper.vm.payModalVisible
        console.log(payModalVisible, '彈窗挽留狀態(tài)')
        // 觸發(fā)點(diǎn)擊事件
        await wrapper.find('.pay-btn').trigger('click');
        // 檢查微信支付之前的接口是否被調(diào)用
        expect(orderPayModel.getPayGroup).toHaveBeenCalledTimes(1);
        // 檢查是否正常埋點(diǎn)
        expect(sensors.track).toHaveBeenCalledTimes(1);
        // 檢查是否觸發(fā)了微信支付 且只允許調(diào)用一次
        expect(wrapper.vm.payNumber).toBe(1)
        // 檢查是否正常埋點(diǎn)
        expect(sensors.track).toHaveBeenCalledTimes(1);
        // wx 支付失敗 是否彈出支付挽留彈窗
        expect(wrapper.vm.payModalVisible).toBe(true)
        console.log(wrapper.vm.payModalVisible, '彈窗挽留狀態(tài)')

    });

})

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市粘捎,隨后出現(xiàn)的幾起案子薇缅,更是在濱河造成了極大的恐慌危彩,老刑警劉巖攒磨,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異汤徽,居然都是意外死亡娩缰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門谒府,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拼坎,“玉大人,你說我怎么就攤上這事完疫√┘Γ” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵壳鹤,是天一觀的道長(zhǎng)盛龄。 經(jīng)常有香客問我,道長(zhǎng)芳誓,這世上最難降的妖魔是什么余舶? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮锹淌,結(jié)果婚禮上匿值,老公的妹妹穿的比我還像新娘。我一直安慰自己赂摆,他們只是感情好挟憔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烟号,像睡著了一般曲楚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上褥符,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天龙誊,我揣著相機(jī)與錄音,去河邊找鬼喷楣。 笑死趟大,一個(gè)胖子當(dāng)著我的面吹牛鹤树,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逊朽,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼罕伯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了叽讳?” 一聲冷哼從身側(cè)響起追他,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岛蚤,沒想到半個(gè)月后邑狸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涤妒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年单雾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片她紫。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡硅堆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贿讹,到底是詐尸還是另有隱情渐逃,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布民褂,位于F島的核電站茄菊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏助赞。R本人自食惡果不足惜买羞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雹食。 院中可真熱鬧畜普,春花似錦、人聲如沸群叶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽街立。三九已至舶衬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赎离,已是汗流浹背逛犹。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虽画。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓舞蔽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親码撰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渗柿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容