11
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Gaiax GroupAdvent Calendar 2018

Day 24

テストデータを簡単に作成することができるrosieの使い方【JavaScript】

Last updated at Posted at 2018-12-23

今日はクリスマスイブ🎄🎄

寂しさを紛らわすために時間もあったので記事を書きました。

内容としては、タイトルにもありますがフロントのテストデータを簡単に作成することができるrosieの基本的な使い方についてです。

環境構築

mkdir rosie_demo
yarn add rosie

これだけです。

使い方

使い方はとてもシンプルです。

  1. Factoryを定義する
  2. オブジェクをビルドする

Factoryを定義する

公式のコードを例に説明します。

const Factory = require('rosie').Factory;

Factory.define('game')
  .sequence('id')
  .attr('is_over', false)
  .attr('created_at', function() { return new Date(); })
  .attr('random_seed', function() { return Math.random(); })
  .attr('players', ['players'], function(players) {
    if (!players) { players = [{}, {}]; }
    return players.map(function(data) {
      return Factory.attributes('player', data);
    });
  });

Factory.define('player')
  .sequence('id')
  .sequence('name', function(i) { return 'player' + i; })
  .attr('position', ['id'], function(id) {
    const positions = ['pitcher', '1st base', '2nd base', '3rd base'];
    return positions[id % positions.length];
  });

まずは以下の部分です。

Factory.define('game')

Factory.define(factory_name)

Factory.defineは後に定義するattrsequenceファクトリーのインスタンスを返します。factory_nameの部分は文字列になります。

.sequence('id')

sequencehはオートインクリメントしたいものを定義します。

次に以下のコードです。

.attr('is_over', false)

attrは最大3つ引数を受け取ります。

instance.attr(attribute_name, default_value)

attribute_nameにはプロパティの名前が入ります。default_valueにはそのままですがデフォルト値が入ります。

instance.attr(attribute_name, generator_function)

generator_functionには以下のようにプロパティの値を生成するための関数が入ります。

.attr('created_at', function() { return new Date(); })

instance.attr(attribute_name, dependencies, generator_function)

3つの場合、dependenciesが第二引数になります。
dependenciesはstring型の配列になり、generator_functionの中で値を生成するためのパラメーターとして使用されます。

.attr('players', ['players'], function(players) {
  if (!players) { players = [{}, {}]; }
  return players.map(function(data) {
   return Factory.attributes('player', data);
  });
});

オブジェクをビルドする

以下のようにbuildメソッドを使用してオブジェクトを作成します。

const game = Factory.build('game', { is_over: true , players: [{ name: "fuga" }, { name:"hoge" }]});
console.log(game)
/*
{ is_over: true,
  players:
   [ { name: 'fuga', id: 1, position: '1st base' },
     { name: 'huga', id: 2, position: '2nd base' } ],
  id: 1,
  created_at: 2018-12-23T08:56:26.520Z,
  random_seed: 0.2721230900040248 }
 */

ビルドする際に値を変更してあげることでさまざまなテストケースに対応することができます。

Factory.build(factory_name, attributes, options)

factory_nameにはfactoryの名前、attributesにはオブジェクトが入ります。オブジェクトの中で上書きしたいキー、バリューを指定します。上記の例ではis_overplyaersになります。

また初期データを複数作成したい場合は、下記のようにbuildListを使います。

Factory.buildList(factory_name, size, attributes, options)

以下のようにsizeを指定してあげるとその数分のテストデータが作成されます。

Factory.define("todo")
  .sequence("id")
  .attr("text", ["id"],(id)=> {
    return id % 2 ? "ラーメン食べる": "髪を切る"
  })
  .attr("completed", ["text"], (text) => {
    return text === "ラーメン食べる" ? true : false
  });

const todos = Factory.buildList("todo", 5);
console.log(todos);
/*
[ { id: 1, text: 'ラーメン食べる', completed: true },
  { id: 2, text: '髪を切る', completed: false },
  { id: 3, text: 'ラーメン食べる', completed: true },
  { id: 4, text: '髪を切る', completed: false },
  { id: 5, text: 'ラーメン食べる', completed: true } ]
*/

他にも便利なものを紹介しておきます。

属性をまとめて定義したい時

以下のように**.attrs**の中に属性を書きます。

Factory.define('game')
  .sequence('id')
  .attrs({
    is_over: false,
    created_at: () => new Date(),
    random_seed: () => Math.random()
  });
const game = Factory.build('game');
console.log(game);
/*
{ id: 1,
  is_over: false,
  created_at: 2018-12-23T09:25:43.223Z,
  random_seed: 0.26435655180714024
}
*/

オブジェクトを生成した後に何か処理をしたい時

以下のようにafterを使用してコールバックを定義します。

Factory.define('coach')
  .option('buildPlayer', false)
  .sequence('id')
  .attr('players', ['id', 'buildPlayer'], (id, buildPlayer) => {
    if (buildPlayer) {
      return [Factory.build('player', { coach_id: id })];
    }
  })
  .after((coach, options) => {
    if (options.buildPlayer) {
      console.log('built player:', coach.players[0]);
    }
  });

Factory.build('coach', {}, { buildPlayer: true });

コールバックが何も返さない場合は、ビルドオブジェクトを最終的な結果として返します。
逆にコールバックが値を返す場合は、その値を返します。

まとめ

以上でrosieの基本的な使い方を紹介しました。
今度はreduxのactionやselectorのテストなどより実践的な使い方を紹介したいと思います。

11
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?