ユーザ用ツール

サイト用ツール


reactnative:jest

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

次のリビジョン
前のリビジョン
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>​
  
  
reactnative/jest.1551131408.txt.gz · 最終更新: 2019/02/26 06:50 by ips