按道理說官配用起來會更舒服纔是,結果接連碰壁,加上雷同狀況的資料確實有點少,只能填一下。css
首先腳手架確定不是cra
(cra
用戶請直接用官方封裝的測試就行),咱們確定會使用本身定製的腳手架。當咱們在選用Jest
作單測時,出現了幾個問題:html
typescript
webpack
css-modules
第二點簡直硬傷,直接致使第三點無從下手。而鄙人又出於「不敢亂動祖傳代碼」的原則,只能往上面繼續填。react
由你喜歡的方式去安裝 Jest
webpack
npm i -D jest @types/jest #or yarn
複製代碼
接着須要配置啓動方式git
// package.json
{
...
"scripts": {
"test": "jest",
...
}
...
"jest": {}
}
複製代碼
還有一個方法官方並無說起到(或者我沒有注意到)的方法,在你的project
放置一個jest.config.js
,一樣能夠配置,對package.json
有潔癖的同窗適用。github
-- 首先咱們須要什麼?
-- TypeScript
!web
npm i -D ts-jest #由於咱們已經用上了 TypeScript 因此不須要多裝一次
複製代碼
{
"jest": {
"moduleFileExtensions": [
"ts",
"tsx"
],
"transform": {
"^.+\\.tsx?$": "ts-jest",
}
}
}
複製代碼
接着,雖然把每一個組件的單測放在該組件的文件夾中顯得更清晰(cra
的作法),可是咱們會更願意把全部測試用例放在test
文件夾中。因此創建好test
目錄,繼續加配置typescript
{
"jest": {
"moduleFileExtensions": [
"ts",
"tsx"
],
"transform": {
"^.+\\.tsx?$": "ts-jest",
},
"testMatch": [
"<rootDir>/test/**/?(*.)(spec|test).ts?(x)"
],
}
}
複製代碼
這樣,在相似ydjnb.test.tsx
或者ydjnb.spec.ts
等等等等的文件纔會被捕獲爲測試文件進行測試。npm
// ydjnb.spec.ts
test('Jest-TypeScript 嘗試運行', () => {
expect(1+1).toBe(2) // Pass
})
複製代碼
至此,你可使用對Typescript
的測試,但對於React
來講還差一點。json
這裏咱們就直接選用Enzyme
了,在Jest
文檔,關於Testing React Apps -- DOM Testing
中,也提到是建議使用Enzyme
。
npm i -D enzyme @types/enzyme
複製代碼
回到ydjnb.spec.ts
中,如今由於涉及到JSX
因此應該更名爲*.tsx
了
// ydjnb.spec.tsx
import { shallow } from 'enzyme'
test('Jest-React-TypeScript 嘗試運行', () => {
const renderer = shallow(<div>hello world</div>)
expect(renderer.text()).toEqual('hello world')
})
複製代碼
固然shallow
只是一種「淺渲染」,它只會對當前組件渲染,作斷言。通常測試除了關心數據還會關心交互,因此還會有另外兩個方法render
, mount
。
-- 配完了!運行一下吧!
-- ERROR
其實細心一點就會發現,我上面的代碼段並無標記// Pass
,並且如今你可能還回頭看了!
因此第一個錯誤仍是很好解決的,由於你仔細看一下測試結果,Enzyme
已經告訴你了。
Enzyme Internal Error: Enzyme expects an adapter to be configured, but found none. To configure an adapter, you should call
Enzyme.configure({ adapter: new Adapter() })
before using any of Enzyme's top level APIs, whereAdapter
is the adaptercorresponding to the library currently being tested. For example:import Adapter from 'enzyme-adapter-react-15';
To find out more about this, see http://airbnb.io/enzyme/docs/installation/index.html
不過我知道我用的已是react-16
了,跟着文檔也會提到關於react-16
的解決方法。
npm i -D enzyme-adapter-react-16
複製代碼
回到ydjnb.spec.tsx
中,
// ydjnb.spec.tsx
import { shallow, configure } from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'
configure({ adapter: new Adapter() })
test('Jest-React-TypeScript 嘗試運行', () => {
const renderer = shallow(<div>hello world</div>)
expect(renderer.text()).toEqual('hello world') // Pass
})
複製代碼
根據Jest
的文檔,加上一個庫解決問題:identity-obj-proxy
{
"moduleNameMapper": {
"\\.(css|scss)$": "identity-obj-proxy"
},
"transform": {
...
},
...
}
複製代碼
至此,需求已經能徹底運做。