2016-08-18 10 views
1

のためのパラメータ化プラグインを使用することはできません。 jsドキュメント:parameterize plugin for qunitは、単純なパラメータ化されたテストを実行することはできませんQUnit

私はこれを行う必要があります:

QUnit 
.cases(testCasesList) 
.test(title, [expect], callback); 

私はコードをチェックし、期待値がnullの場合は、コールバック関数に初期化されます。私も期待= 3と3番目のパラメータとしてコールバックを試みたが、それは同じエラーを返す、コールバック関数はnullです。

私は間違っていますか?

パラメータが必要な場合、関数は数値ですか?

+0

ダンノーこのことは間違っています、その盗聴! expectとcallbackの2つの関数を追加すると、最初の関数だけがQUnit.testオブジェクトのプロパティを含むparamsを出力し、assertは未定義です:) – Vlad

答えて

1

私はこのツールが以前のバージョンのQUnit用に作られたと思います。私はいくつかのデバッグを行い、解決策になった:

/* 
* Parameterize v 0.4 
* A QUnit Addon For Running Parameterized Tests 
* https://github.com/AStepaniuk/qunit-parameterize 
* Released under the MIT license. 
*/ 
QUnit.extend(QUnit, { 
    cases: (function() { 
    'use strict'; 
    var currentCases = null, 
     clone = function(testCase) { 
      var result = {}, 
       p = null; 

      for (p in testCase) { 
       if (testCase.hasOwnProperty(p)) { 
        result[p] = testCase[p]; 
       } 
      } 

      return result; 
     }, 
     createTest = function(methodName, title, expected, callback, parameters) { 

      QUnit[methodName](title + ", test params: " + JSON.stringify(parameters), function(assert) { 
       return callback.call(this, parameters, assert); 
      }); 
     }, 

     iterateTestCases = function(methodName, title, expected, callback) { 
      var i = 0, 
       parameters = null, 
       testCaseTitle = null; 

      if (!currentCases || currentCases.length === 0) { 
       // setup test which will always fail 
       QUnit.test(title, function(assert) { 
        assert.ok(false, "No test cases are provided"); 
       }); 
       return; 
      } 

      if (!callback) { 
       callback = expected; 
       expected = null; 
      } 

      for (i = 0; i < currentCases.length; i += 1) { 
       parameters = currentCases[i]; 

       testCaseTitle = title; 
       if (parameters.title) { 
        testCaseTitle += "[" + parameters.title + "]"; 
       } 

       createTest(methodName, testCaseTitle, expected, callback, parameters); 
      } 
     }, 

     getLength = function(arr) { 
      return arr ? arr.length : 0; 
     }, 

     getItem = function(arr, idx) { 
      return arr ? arr[idx] : undefined; 
     }, 

     mix = function(testCase, mixData) { 
      var result = null, 
       p = null; 

      if (testCase && mixData) { 
       result = clone(testCase); 

       for (p in mixData) { 
        if (mixData.hasOwnProperty(p)) { 
         if (p !== "title") { 
          if (!(result.hasOwnProperty(p))) { 
           result[p] = mixData[p]; 
          } 
         } else { 
          result[p] = [result[p], mixData[p]].join(""); 
         } 
        } 
       } 

      } else if (testCase) { 
       result = testCase; 
      } else if (mixData) { 
       result = mixData; 
      } else { 
       // return null or undefined whatever testCase is 
       result = testCase; 
      } 

      return result; 
     }; 

    return { 

     init: function(testCasesList) { 
      currentCases = testCasesList; 
      return this; 
     }, 

     sequential: function(addData) { 
      var casesLength = getLength(currentCases), 
       addDataLength = getLength(addData), 
       length = casesLength > addDataLength ? casesLength : addDataLength, 
       newCases = [], 
       i = 0, 
       currentCaseI = null, 
       dataI = null, 
       newCase = null; 

      for (i = 0; i < length; i += 1) { 
       currentCaseI = getItem(currentCases, i); 
       dataI = getItem(addData, i); 
       newCase = mix(currentCaseI, dataI); 

       if (newCase) { 
        newCases.push(newCase); 
       } 
      } 

      currentCases = newCases; 

      return this; 
     }, 

     combinatorial: function(mixData) { 
      var current = (currentCases && currentCases.length > 0) ? currentCases : [null], 
       currentLength = current.length, 
       mixDataLength = 0, 
       newCases = [], 
       i = 0, 
       j = 0, 
       currentCaseI = null, 
       dataJ = null, 
       newCase = null; 

      mixData = (mixData && mixData.length > 0) ? mixData : [null]; 
      mixDataLength = mixData.length; 

      for (i = 0; i < currentLength; i += 1) { 
       for (j = 0; j < mixDataLength; j += 1) { 
        currentCaseI = current[i]; 
        dataJ = mixData[j]; 
        newCase = mix(currentCaseI, dataJ); 

        if (newCase) { 
         newCases.push(newCase); 
        } 
       } 
      } 

      currentCases = newCases; 

      return this; 
     }, 

     test: function(title, expected, callback) { 
      iterateTestCases("test", title, expected, callback); 
      return this; 
     }, 

     getCurrentTestCases: function() { 
      return currentCases; 
     } 
    }; 
    }()) 
}); 

まず第一に、私は著者が4つの追加機能とQUnitを拡張したいと思います:

sequential(addData); 
combinatorial(mixData); 
test(title, expected, callback); 
asyncTest(title, expected, callback); 

が、そうしませんでした。私がしたことは、関数の代わりに "ケース"をオブジェクトに変換し、内部でテストケースの配列を初期化するinit()関数を追加したことです。

私もcreateTest()関数を変更: "期待される" パラメータを渡さず、直接(タイトル、コールバック)QUnit.testを呼び出し

createTest = function(methodName, title, expected, callback, parameters) { 
    QUnit[methodName](title + ", test params: " + JSON.stringify(parameters), function(assert) { 
     return callback.call(this, parameters, assert); 
    }); 
} 

。この "期待された"パラメータで何が意図されていたのかは不明ですが、テストケース配列内に独自のパラメータを追加して、何を期待するべきかをまだカバーすることができます。ここで

は、私は3つのパラメータ化テストを作成する方法の例です:

QUnit.cases 
     .init([{a: 1, b: 2, expected: 3}, {a: 4, b: 5, expected: 9}, {a: -5, b: 5, expected: 0}]) 
     .test("test sum(a, b)", function (parameters, assert) { 
      var sum = parameters.a + parameters.b; 

      assert.equal(sum, parameters.expected, "expected: " + parameters.expected + ", calculated: " + sum); 
     }); 

現在のスクリプトは、シーケンシャルテストをカバーしていますが、私はとにかくこの関数を左:

qunit 
    .cases 
    .init([ 
     {param1: 50}, 
     {param1: 200}, 
     {param1: 300} 
    ]) 
    .sequential([ 
     {param2: 100}, 
     null, 
     {param2: 150} 
    ]) 
    .test("Meta tests for QUnit Parametrize plugin", function (params, assert) { 
     console.dir(params); 
     assert.equal(params.param1, params.param2,""); 
    }); 

をあなたはまた、作成した、組合せテストを作成することができますinit()およびcombinatorial()パラメータセグメントのテストの組み合わせ

qunit 
    .cases 
    .init([ 
     {param1: 50} 
    ]) 
    .combinatorial([ 
     {param2: 100}, 
     {param2: 150}, 
     {param2: 50} 
    ]) 
    .test("Meta tests for QUnit Parametrize plugin", function (params, assert) { 
     assert.equal(params.param1, params.param2,""); 
    }); 

最新版ではQUnit.async()はサポートされていません。非同期テストにもQUnit.test() を使用する必要があります。相談する:qunit 2.x upgrade 私はQUnitパラメータから非同期を削除しました。 読んでいただきありがとうございます:)

関連する問題