2014-09-26 3 views

ответ

1

AFAIK Jasmine не имеет поддержки параметризованных тестов. Так что я придумал этот простой подход:

describe('Testing module', function() { 
     var testCases = [ 
      { param1: 'testcase1Param1', param2: 'testCase1Param2'}, 
      { param1: 'testcase2Param1', param2: 'testCase2Param2'}, 
     ]; 

     /*jshint -W083 */ //Disable warning for function created inside loop 
     //this is parametrized test and it's better readable this way. 
     testCases.forEach(function(testCase) { 
     describe('for test case: param1" ' + testCase.param1 + 
      ' and param2: "' + testCase.param2 + '"', function() { 
      //do your testing 
     } 
     } 
}); 
0

Вдохновленный этим,

я написал что-то, чтобы получить это (параметры не позиционный):

describe('sum()', function() {   
    helper.executeTestCases({ 
     description: 'given values #param1 and #param2 should return #result', 
     values: [ 
      { param1: 1, param2: 2, result: 3} 
      ,{ param2: 5, result: 7, param1: 2}    
     ], 
     test: function(param1, param2, result){ 
      expect(param1 + param2 /*your code here*/).toEqual(result); 
     }   
    }); 
}); 

Это WIP, но это здесь:

var helper = (function Helper(){   

    var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; 
    var ARGUMENT_NAMES = /([^\s,]+)/g; 
    function getParamNames(func) { 
     var fnStr = func.toString().replace(STRIP_COMMENTS, ''); 
     var result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(ARGUMENT_NAMES); 
     return result || []; 
    }; 

    /* 
    given the string "this is a #one" an the values {one:"test"} it returns "this is a test" 
    */ 
    function createDescription(description, values){ 
     var placeHolders = description.match(/(#\w+)/g); 
     if(!placeHolders) throw Error("Fail to recognize placeHolders in test description (" + description + ")."); 
     placeHolders.forEach(function(placeHolder, index){ 
      var newValue = values[placeHolder.substr(1)]; // remove the "#" 
      description = description.replace(placeHolder, newValue);      
     });  
     return description; 
    }; 


    return { 

     executeTestCases: function(params){ 
      params.values.forEach(function(element, index){ 
       var description = createDescription(params.description, element);      

       var paramNames = getParamNames(params.test); 
       var parameters = []; 
       paramNames.forEach(function(name){ 
        if(!element.hasOwnProperty(name)) throw new Error('Element "' + name +'" not found in row #' + (index+1) + '" of test case values."'); 
        parameters.push(element[name]);       
       }); 

       return it(description, function(){ 
        params.test.apply(null, parameters); 
       });      
      }); 
     } 
    }; 

})();  

Алессандро

Смежные вопросы