読者です 読者をやめる 読者になる 読者になる

jasmineでparameterizedテスト

Rubyには、RSpecプラグインとしてinput/outputを配列(もしくはtable形式)で定義して
テストすできる便利なものがあります。
テストがsimpleになりますし、境界地のテストなんかに便利ですね。
tomykaira/rspec-parameterized
こんなやつ。

  where(:a, :b, :answer) do
    [
      [1 , 2 , 3],
      [5 , 8 , 13],
      [0 , 0 , 0]
    ]
  end

  with_them do
    it "should do additions" do
      expect(a + b).to eq answer
    end
  end

これのjasmine版がないのかと探してみたら
kannokanno/jasmine-parameterize: jasmine plugin for parameterized test
jasmine-params
というのがありました。
 
今回はnpmで入れたいという変なこだわりがるためkannokanno/jasmine-parameterizeはパス。 jasmine-params はnpmに対応しているのですが
githubを覗いてみると(FrankyBoy/jasmine-params: Parameterization for jasmine tests
どうも人氣がありません。
 
少し悩んだ末、汎用的な parameterized tests はいいから
要件に見合うようにshared example的なものを用意するのは簡単そうなので
今回はその方針で対応してみました。

    // shared exampleをfunctionとして定義
    function sharedBehaviorForUpdateHlParameter(inputs) {
      var parameterizedTest = function(expected, query, hl) {
        it(":updateHlParameter('" + query + "', '" + hl + "') == " + expected, function() {
            expect(updateHlParameter(query, hl)).toBe(expected);
        });
      };
      for (var i = 0; i < inputs.length; i++) {
        parameterizedTest.apply(this, inputs[i]);
      }
    }

    describe("has no parameters", function () {
      var inputs = [
        ['?hl=ja', '', 'ja'],
        ['?hl=en', '', 'en'],
      ];
      // 配列としてinput/outputを定義して shared exampleをcall
      sharedBehaviorForUpdateHlParameter(inputs);
    });

とりあえず満足。
ポイントは、apply() を利用することで引数に配列を突っ込めるところ。
汎用的なparameterized testsはjasmine界隈では需要がないのかしら。