この文書の現在のバージョンと選択したバージョンの差分を表示します。
次のリビジョン | 前のリビジョン | ||
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> | ||