2016-08-18 3 views
1

에 대한 변수화 플러그인을 사용할 수 없습니다. js 문서 : parameterize plugin for qunit간단한 파라미터 테스트를 실행할 수 없습니다 QUnit

해야 할 일 :

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

코드를 검사하고 예상 값이 null이면 두 번째 코드가 콜백 함수로 초기화됩니다. 나는 기대도 = 3 시도하고 세 번째 매개 변수로 콜백하지만 그것은 여전히 ​​같은 오류를 제공, 콜백 함수는 null입니다.

내가 잘못 할 수 있습니까?

예상되는 매개 변수는 숫자입니까?

+0

Dunno이게 뭐가 잘못 되었나요? expect와 callback에 두 개의 함수를 추가하면 첫 번째 함수 만이 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() 함수를 추가 한 것입니다. 직접 "예상"매개 변수를 전달하지 않고 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); 
    }); 
} 

(제목, 콜백) :

은 또한에 createTest() 함수를 변경했습니다. 이 "예상 된"매개 변수로 무엇을 의도했는지 확신 할 수 없지만 테스트 케이스 배열 내부에 사용자 고유의 매개 변수를 추가 할 수 있으며 여전히 예상해야 할 내용을 포함 할 수 있습니다.

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); 
     }); 

현재 스크립트가 순차적 인 테스트를 포함하지만, 어쨌든이 기능을 왼쪽 : 여기

내가 3 개 매개 변수화 테스트를 만드는 방법 예입니다

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 매개 변수에서 비동기를 제거했습니다. 읽어 주셔서 감사합니다 :)