Frisby.js v2.xを使用したWeb APIテスト

  • 1
    いいね
  • 0
    コメント

v2.xでの変更点

Upgrading From Frisby 0.x to 2.x

  • Frisby.jsでJasmine Test Frameworkを隠蔽しない
  • Jasmine Testの実行環境をjasmine-nodeからJestに変更
  • JSON Validatorにjoiを採用
  • JSON Schemaは未サポート(2017/09/25現在)

細かいところでは…

環境

パッケージ

Frisby.js
https://www.npmjs.com/package/frisby
https://www.frisbyjs.com/

Jest
https://www.npmjs.com/package/jest
http://facebook.github.io/jest/

環境構築

$ npm install frisby
$ npm install jest

テスト作成

記述

__tests__/*.js
const frisby = require('frisby');

beforeAll(function () {
  frisby.globalSetup({
    // 共通設定
  });
});

describe('Describe', function () {
  it('Test', function (doneFn) {
    // FrisbySpecでテストを実施する
    frisby.get('/users/1')
      // FrisbySpecでチェーンする
      // 色々準備して…
      .done(doneFn);
  });
});

Frisby

メソッド
formData() FormDataを生成する(Multipart用)
create(name) Deplicated
プロパティ
version
Joi joiを参照する

Global setup

メソッド
globalSetup(opts) 上書き
nullを指定すると既定値に戻る
baseUrl(url) globalSetup()後に設定する

opts

{
  request: {
    credentials: 'include',

    headers: {
      // 既定値
      'Content-Type': 'application/json',
      'User-Agent': 'frisby/2.0.5 (+https://github.com/vlucas/frisby)',
    },

    // baseUrl(既定値:undefined)
    baseUrl: '',

    // 認証(既定値:undefined)
    auth: {
      user: '',
      password: '',
      sendImmediately: false,
    },

    // timeout(既定値:5000[ms])
    timeout: 5000,
  },
};

FrisbySpec

メソッド
get()
patch()
post()
put()
del()
fetch()
use()
setup()
timeout()
fromJSON()

FrisbySpecを返却する

Custom Expect Handlers

Define Custom Expect Handlers

メソッド
addExpectHandler(expectName, expectFn)
removeExpectHandler(expectName)
サンプル(HTTPステータスがどれかに一致するかどうか)
const frisby = require('frisby');

beforeAll(function () {
  frisby.addExpectHandler('statuses', function (response, statuses) {
    if (Array.isArray(statuses)) {
      expect(statuses).toContain(response.status);
    } else {
      expect(response.status).toBe(statuses);
    }
  });
});

afterAll(function () {
  // 必要であれば削除する
  frisby.removeExpectHandler('statuses');
});

describe('Custom Expect Handler', function () {
  it('Test', function (doneFn) {
    frisby.get('https://www.google.com')
      .expect('statuses', [200, 301])
      .expect('statuses', 200)
      .done(doneFn);
  });
});

FrisbySpec

  • メソッドはFrisbySpecを返却する(チェーンが可能)
  • getterはuse()を使用する
メソッド
use(fn) チェーン用
setup(opts, replace) 通常はglobalSetup()で設定する
replaceがtrueの場合は上書き
timeout(timeout) getter/setter
fromJSON(json) テスト用(jsonで指定した値がResponseとなる)
getBaseUrl()

HTTP Requests

メソッド
get(url, params)
patch(url, params)
post(url, params)
put(url, params)
del(url, params)
fetch(url, params = {}, options = {}) node-fetch API用
HTTP HEADで要求する場合
const frisby = require('frisby');

describe('HTTP method', function () {
  it('HEAD', function (done) {
    frisby.fetch('http://qiita.com/', {
      method: 'head',
      compress: false,
    })
      .expect('status', 200)
      .done(done);
  });
});

Expectations

メソッド
expect(expectName)
expectNot(expectName)

Built-In Expect Handlers

  • jsonは指定した値のみ、jsonStrictはすべての値を検証する

Inspectors

メソッド
inspectRequest()
inspectRequestHeaders()
inspectResponse()
inspectHeaders()
inspectStatus()
inspectBody()
inspectJSON()
inspectLog() 即時出力

Promise

メソッド
then(fn)
catch(fn)
done(doneFn)
promise() node-fetchのPromiseが返却される

Tips

Form形式の場合

v2.xはJSON形式が前提(jsonパラメーターがなくなった)だが、以下のようにすることでv.0.8.5から多少の変更で送信が可能

application/x-www-form-urlencoded
const frisby = require('frisby');
const qs = require('qs'); // Jestで入る

describe('application/x-www-form-urlencoded', function () {
  it('Test', function (doneFn) {
    frisby.post('/login', {
      body: qs.stringify({
        id: 'testy.mctesterpants@example.com',
        password: 'frisbbbbbbbbbby',
      }),
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
      }
    })
      .expect('status', 200)
      .done(done);
  });
});

他の方法(Jestに依存しない)

application/x-www-form-urlencoded
const frisby = require('frisby');

describe('application/x-www-form-urlencoded', function () {
  it('Test', function (doneFn) {
    var form = frisby.formData();
    form.append('password', 'frisbbbbbbbbbby');

    frisby.post('/login', {
      body: form,
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
      }
    })
      .expect('status', 200)
      .done(done);
  });
});

テスト実施

準備

package.json
{
  "scripts": {
    "test": "jest"
  }
}

オプション
Configuring Jest

実行

  1. すべて実行する場合
    $ npm test
  2. ファイルを指定して実行する場合
    $ npm test -- __tests__/xxx.spec.js