QUnitでメソッドのテストをいろいろな条件でやりたいとき

あるメソッドがオブジェクトの状態により返す値が変わる時。 今までこうやってました。そして、すごくめんどくさいと感じていました。

test('myMethod: when x is true, y is false', function(assert) {
  let target = this.subject({
    x: true,
    y: false
  });
  assert.equal(target.myMethod(), 'hoge', 'returns "hoge"');
});

test('myMethod: when x is true, y is true', function(assert) {
  let target = this.subject({
    x: true,
    y: true
  });
  assert.equal(target.myMethod(), 'huga', 'returns "huga"');
});

こんな方法を思いつきました。テスト条件とテスト対象がクローズアップされて大変分かりやすいと思います。そしてBDD使えばいいと思います。

let myMethodTest = function(condition, tests) {
  test(`myMethod when x:${condition.x}, y:${condition.y}`, function(assert) {
    let target = this.subject({
      x: condition.x,
      y: condition.y
    });
    tests(assert, target.myMethod);
  });
};


myMethodTest({
  x: true,
  y: false
}, function(assert, subject) {
  assert.equal(subject(), 'hoge');
});

myMethodTest({
  x: true,
  y: true
}, function(assert, subject) {
  assert.equal(subject(), 'huga');
});