【Vue】Jestを使った Vue / TypeScript の単体試験 ~ axios 編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/01/07/230317
https://dk521123.hatenablog.com/entry/2021/01/27/225148
https://dk521123.hatenablog.com/entry/2021/03/13/000000

の続き。

今回は、Vue 内で、axios を使った画面に対して、
単体試験を行いたいので、調べてみた。

目次

【1】環境設定
【2】構文:Mockからデータを返却する
【3】サンプル

【1】環境設定

axios をモックかするのに、
axios-mock-adapter を使用する

コマンド
https://github.com/ctimmerm/axios-mock-adapter

より抜粋
~~~~~~~~~~~~~
npm install axios-mock-adapter --save-dev
~~~~~~~~~~~~~

【2】構文:Mockからデータを返却する

import MockAdapter from 'axios-mock-adapter';
import axios from 'axios';

const mockAxios = new MockAdapter(axios);

// onGet 以外には、onPost / onAny などがある
mock.onGet("/users").reply(function (config) {
  // `config` is the axios config and contains things like the url

  // return an array in the form of [status, data, headers]
  return [
    // 200 OK
    200,
    // 返却したいデータを設定
    {
      users: [{ id: 1, name: "John Smith" }],
    },
  ];
});

【3】サンプル

以下の関連記事の「例5:Vue/TypeScript での リスト表示」の
単体試験を行ってみる

https://dk521123.hatenablog.com/entry/2021/01/14/101645

* consoleログのモック化は、以下の関連記事を参照のこと。

JS単体試験ツール Jest ~ Mock編 ~
https://dk521123.hatenablog.com/entry/2021/01/26/215558
Demo2.spec.ts

import { shallowMount, Wrapper } from '@vue/test-utils';
import Demo2 from '@/views/Demo2.vue';

import flushPromises from 'flush-promises';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';

describe('Demo2.vue', () => {
  let wrapper: Wrapper<Demo2>;
  let mockAxios: MockAdapter;
  console.info = jest.fn();
  console.error = jest.fn();

  beforeEach(() => {
    mockAxios = new MockAdapter(axios);
  });

  it('This is just a demo test', async () => {
    mockAxios.onGet('https://jsonplaceholder.typicode.com/users').reply(200, [
      {
        id: 1,
        name: 'Mike',
        email: 'mike@gmail.com',
      },
      {
        id: 2,
        name: 'Tom',
        email: 'tom@gmail.com',
      },
      {
        id: 3,
        name: 'Sam',
        email: 'sam@gmail.com',
      },
    ]);

    wrapper = shallowMount(Demo2);
    
    await flushPromises();

    const vm = (wrapper.vm as any);
    console.log(vm.items);
    expect(vm.items[0].id).toEqual(1);
    expect(vm.items[0].name).toEqual('Mike');
    expect(vm.items[0].email).toEqual('mike@gmail.com');
    expect(vm.items[1].id).toEqual(2);
    expect(vm.items[1].name).toEqual('Tom');
    expect(vm.items[1].email).toEqual('tom@gmail.com');
    expect(vm.items[2].id).toEqual(3);
    expect(vm.items[2].name).toEqual('Sam');
    expect(vm.items[2].email).toEqual('sam@gmail.com');

    expect(console.info).toHaveBeenCalledWith('Response OK');
  });

  it('This is a network error test', async () => {
    mockAxios.onGet('https://jsonplaceholder.typicode.com/users').networkError();

    wrapper = shallowMount(Demo2);
    
    await flushPromises();

    expect(console.error).toHaveBeenCalledWith('Error...');
  });
});

参考文献

https://dev.classmethod.jp/articles/vue-unittest-using-axios-mock-adapter/
https://www.wantedly.com/companies/istyle/post_articles/181566
https://blog.yug1224.com/archives/59efdfbc3804030a73c96f8a/
https://qiita.com/torinist/items/39d91c034aebd59351d3
https://qiita.com/goodtea0223/items/2c9316496c12bd3a8e27
https://qiita.com/Sue_chan/items/d73a4e3a4856046bc296

関連記事

Jestを使った Vue / TypeScript の単体試験 ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2021/01/07/230317
Jestを使った Vue / TypeScript の単体試験 ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2021/01/27/225148
Jestを使った Vue / TypeScript の単体試験 ~ 非同期編 ~
https://dk521123.hatenablog.com/entry/2021/03/13/000000
Jestを使った Vue / TypeScript の単体試験 ~ axios / あれこれ 編 ~
https://dk521123.hatenablog.com/entry/2021/03/26/225814
非同期処理 ~ async/await, Promise ~
https://dk521123.hatenablog.com/entry/2021/01/16/202822
axios ~ 外部API通信ライブラリ ~
https://dk521123.hatenablog.com/entry/2021/01/14/101645
JS単体試験ツール Jest ~ Mock編 ~
https://dk521123.hatenablog.com/entry/2021/01/26/215558