對於javascript,我們可以使用jest
來進行測試。
安裝
我們先安裝node
,這個在前面的blog應該有提及,這裡就不放連結了。
直接從npm
下手吧。
1 | npm install --save-dev jest |
我們在資料夾裡建立sum.js
與sum.test.js
,來做簡單的測試。
先撰寫sum.js
1 | function sum(a, b){ |
接著在sum.test.js
裡撰寫
1 | const sum = require('./sum'); |
接著在cmd
裡輸入
1 | npm test |
就可以看見
1 | PASS ./sum.test.js |
如果有問題,請去package.json
裡翻找並修正。
1 | "scripts": { |
匹配器
這裡的toBe
叫做匹配器,當然不是只有這個,還有toBeNull
、toBeUndefined
、toBeTruthy
、toBeFalsy
……等等。
拋錯
在sum.js
裡繼續撰寫
1 | function myFunction(input){ |
這時候我們可以知道,如果這個input
如果不是數字的話,就會拋出錯誤。
那我們就可以在sum.test.js
裡寫下
1 | const myFunction = require('./sum'); |
這個時候會pass
,因為它裡面本來就不是數字。
1 | PASS ./sum.test.js |
相等
在sum.test.js
裡撰寫。
1 | test('object assignment ', () => { |
這裡我們可以一目瞭然的看見toEqual
。
1 | PASS ./sum.test.js |
falsy, thruthy
這裡是針對if
的。
1 | test('null is falsy ', () => { |
如果null
為否,則通過。
1 | PASS ./sum.test.js |
async, await
這裡的話就和機器人那會差不多,jest只要知道它測試的東西是不是完成,就可以往其他地方執行其他程式。
1 | test('the date is peanute butter', done => { |
上面的是測試階段,也就是說我只要知道它執行ok就沒問題咧。
1 | function fetchData(callback){ |
我這裡定義的是,在1000毫秒之後,回掉這個函式,並傳遞peanut butter
這個參數。setTimeout
是模擬等待數據返回的過程。
Promise
我這裡先定義一個fetchPromise
。
1 | function fetchPromise(){ |
這裡會丟回來一個Promise
,在延遲1000毫秒之後,會回傳resolve
,並傳遞一個peanut butter
。
所以,那我們只需要這麼寫
1 | test('the data is peanut butter', async () => { |
這樣就可以知道這個值是不是一樣了,一樣就會pass
。
模擬函數
這裡簡單介紹一下mock function
。
1 | test('mock implementation of a basic function', () => { |
第一點,我們先建立一個mock
函式,它有個x
參數,把x
值丟進去後會回傳42 + x
的結果。
第二點,如果toHaveBeenCalledWith()
這裡面的數字被調用過,那就是pass
(因為是使用指定的參數)。
監測
這裡使用jest.spyOn
來達到效果
1 | test('spying on method of an object', () => { |
我們建立了vedio
這個function
,裡面有個play
函式,如果使用了則返回true
。
這個spy
監聽了vedio
裡面的play
函式。
如果這個paly
被調用過,那這裡就會pass
。spy.mockRestore()
,如果被調用過,則恢復到原始狀態,不會對後續的測試產生影響。
簡單來說,還有許多的地方沒深究,還是得花點時間。