この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 次のリビジョン | 前のリビジョン | ||
|
reactnative:jest [2019/02/26 06:50] ips 作成 |
reactnative:jest [2019/03/05 01:09] (現在) ips |
||
|---|---|---|---|
| ライン 10: | ライン 10: | ||
| npm i jest | npm i jest | ||
| </code> | </code> | ||
| + | |||
| + | ===== package.json ===== | ||
| <code> | <code> | ||
| //package.jsonに追加 | //package.jsonに追加 | ||
| ライン 16: | ライン 18: | ||
| }, | }, | ||
| "jest": { | "jest": { | ||
| - | "preset": "jest-expo" | + | "preset": "jest-expo", |
| + | "testEnvironment": "node" //必須ではない。jsdomを無効にしてテストを早くする | ||
| } | } | ||
| </code> | </code> | ||
| <code> | <code> | ||
| npm test | npm test | ||
| + | npm test -- --watch // ウォッチモードの場合 | ||
| </code> | </code> | ||
| ライン 34: | ライン 38: | ||
| <code> | <code> | ||
| npm install jest | npm install jest | ||
| + | </code> | ||
| + | |||
| + | ===== 使い方 ===== | ||
| + | |||
| + | [[https://medium.com/@rickhanlonii/understanding-jest-mocks-f0046c68e53c|Understanding Jest Mocks]] | ||
| + | |||
| + | <code javascript /src/math.js> | ||
| + | export const add = (a, b) => a + b; | ||
| + | export const subtract = (a, b) => b - a; | ||
| + | export const multiply = (a, b) => a * b; | ||
| + | export const divide = (a, b) => b / a; | ||
| + | </code> | ||
| + | |||
| + | <code javascript App.js> | ||
| + | import * as math from './src/math' | ||
| + | |||
| + | export const doAdd = (a, b) => math.add(a, b); | ||
| + | export const doSubtract = (a, b) => math.subtract(a, b); | ||
| + | export const doMultiply = (a, b) => math.multiply(a, b); | ||
| + | export const doDivide = (a, b) => math.divide(a, b); | ||
| + | </code> | ||
| + | |||
| + | ==== 呼び出しの追跡 ==== | ||
| + | |||
| + | <code javascript App.test.js> | ||
| + | import * as app from "./App" | ||
| + | import * as math from "./src/math" | ||
| + | |||
| + | describe(" Mock Function provides 3 features",()=>{ | ||
| + | test("1.Capture calls 呼び出しを追跡する",()=>{ | ||
| + | const mock = jest.fn() | ||
| + | let result = mock("foo") | ||
| + | |||
| + | expect(result).toBeUndefined() | ||
| + | expect(mock).toHaveBeenCalled() | ||
| + | expect(mock).toHaveBeenCalledTimes(1) | ||
| + | expect(mock).toHaveBeenCalledWith("foo") | ||
| + | }) | ||
| + | }) | ||
| + | </code> | ||
| + | |||
| + | ==== 戻り値の設定 ==== | ||
| + | |||
| + | <code javascript App.test.js> | ||
| + | import * as app from "./App" | ||
| + | import * as math from "./src/math" | ||
| + | |||
| + | describe(" Mock Function provides 3 features",()=>{ | ||
| + | test("2-1.Set return values 戻値をセットする fn()",()=>{ | ||
| + | const mock = jest.fn(() => "bar") | ||
| + | |||
| + | expect(mock("foo")).toBe("bar") | ||
| + | expect(mock).toHaveBeenCalledWith("foo") | ||
| + | }) | ||
| + | }) | ||
| + | </code> | ||
| + | |||
| + | ==== 実装の変更 ==== | ||
| + | |||
| + | <code javascript App.test.js> | ||
| + | import * as app from "./App" | ||
| + | import * as math from "./src/math" | ||
| + | |||
| + | describe(" Mock Function provides 3 features",()=>{ | ||
| + | test("3-1.Change the implementation 実装を変更する mockImplementation()",()=>{ | ||
| + | const mock = jest.fn().mockImplementation(() => "bar") | ||
| + | |||
| + | expect(mock("foo")).toBe("bar") | ||
| + | expect(mock).toHaveBeenCalledWith("foo") | ||
| + | }) | ||
| + | |||
| + | test("3-2.Change the implementation 実装を変更する1回",()=>{ | ||
| + | const mock = jest.fn().mockImplementationOnce(() => "bar") | ||
| + | |||
| + | expect(mock("foo")).toBe("bar") | ||
| + | expect(mock).toHaveBeenCalledWith("foo") | ||
| + | | ||
| + | expect(mock("baz")).toBe(undefined) | ||
| + | expect(mock).toHaveBeenCalledWith("baz") | ||
| + | }) | ||
| + | |||
| + | test("3-3.Change the implementation 実装を変更する promise",()=>{ | ||
| + | const mock = jest.fn() | ||
| + | mock.mockResolvedValue("bar") | ||
| + | | ||
| + | expect(mock("foo")).resolves.toBe("bar") | ||
| + | expect(mock).toHaveBeenCalledWith("foo") | ||
| + | }) | ||
| + | }) | ||
| + | </code> | ||
| + | |||
| + | ==== 関数のモック ==== | ||
| + | <code javascript App.test.js> | ||
| + | import * as app from "./App" | ||
| + | import * as math from "./src/math" | ||
| + | |||
| + | describe("モジュールと関数をモックする",()=>{ | ||
| + | test("1.関数をモックする", () => { | ||
| + | math.add = jest.fn() | ||
| + | |||
| + | app.doAdd(1, 2) | ||
| + | expect(math.add).toHaveBeenCalledWith(1, 2) | ||
| + | }); | ||
| + | }) | ||
| + | </code> | ||
| + | |||
| + | ==== モジュールのモック(jset.mock()) ==== | ||
| + | <code javascript App.test.js> | ||
| + | import * as app from "./App" | ||
| + | import * as math from "./src/math" | ||
| + | |||
| + | //import と同じ階層で書く必要があるようだ。 | ||
| + | //importもかかないとmahtが使えない。 | ||
| + | //importした関数全てに math.xxx = jest.fn()している。 | ||
| + | jest.mock("./src/math") | ||
| + | |||
| + | describe("モジュールと関数をモックする",()=>{ | ||
| + | test("2.モジュールをモックする", () => { | ||
| + | app.doAdd(1, 2) | ||
| + | expect(math.add).toHaveBeenCalledWith(1, 2); | ||
| + | |||
| + | app.doSubtract(1, 2); | ||
| + | expect(math.subtract).toHaveBeenCalledWith(1, 2); | ||
| + | }); | ||
| + | }) | ||
| + | </code> | ||
| + | |||
| + | ==== スパイ ==== | ||
| + | |||
| + | <code javascript App.test.js> | ||
| + | describe("スパイ",()=>{ | ||
| + | |||
| + | test("1.関数をスパイする", () => { | ||
| + | const addMock = jest.spyOn(math, "add"); | ||
| + | |||
| + | //実装は変わらない | ||
| + | expect(app.doAdd(1, 2)).toEqual(3); | ||
| + | | ||
| + | //しかし追跡できる | ||
| + | expect(addMock).toHaveBeenCalledWith(1, 2); | ||
| + | }); | ||
| + | |||
| + | test("2.スパイしている関数の実装を変更して戻す", () => { | ||
| + | const addMock = jest.spyOn(math, "add"); | ||
| + | | ||
| + | // 実装を変更する | ||
| + | addMock.mockImplementation(() => "mock"); | ||
| + | expect(app.doAdd(1, 2)).toEqual("mock"); | ||
| + | | ||
| + | // 元に戻す | ||
| + | addMock.mockRestore(); | ||
| + | expect(app.doAdd(1, 2)).toEqual(3); | ||
| + | }); | ||
| + | }) | ||
| + | </code> | ||
| + | |||
| + | ==== スパイは基本のfn()の組み合わせ ==== | ||
| + | <code javascript App.test.js> | ||
| + | describe("スパイ",()=>{ | ||
| + | test("スパイは基本のfn()の組み合わせ", () => { | ||
| + | |||
| + | // オリジナル実装をバックアップ | ||
| + | const originalAdd = math.add; | ||
| + | | ||
| + | // オリジナル実装でモックする | ||
| + | math.add = jest.fn(originalAdd); | ||
| + | | ||
| + | // オリジナル実装のスパイができるようになる | ||
| + | expect(app.doAdd(1, 2)).toEqual(3); | ||
| + | expect(math.add).toHaveBeenCalledWith(1, 2); | ||
| + | | ||
| + | // 実装を変更する | ||
| + | math.add.mockImplementation(() => "mock"); | ||
| + | expect(app.doAdd(1, 2)).toEqual("mock"); | ||
| + | expect(math.add).toHaveBeenCalledWith(1, 2); | ||
| + | | ||
| + | // オリジナル実装に戻す | ||
| + | math.add = originalAdd; | ||
| + | expect(app.doAdd(1, 2)).toEqual(3); | ||
| + | }) | ||
| + | }) | ||
| </code> | </code> | ||