2014-12-26 54 views
2

我是node.js的新手,從事異步框架工作已經有一段時間了。 在程序語言如Python中這樣很容易通過他們擁有的輸入列表和預期產出,然後循環測試:如何在nodejs中重複使用異步調用的測試函數?

tests = { 
    1: [2, 3], 
    2: [3, 4], 
    7: [8, 9], 
} 

for input, expected_out in tests.items(): 
    out = myfunc(input) 
    assert(out == expected_out) 

我試圖做的NodeJS /摩卡/應類似:

var should = require('should'); 

function myfunc(x, cb) { var y = x + 1; var z = x + 2; cb([y, z]); }; 

describe('.mymethod()', function() { 
    this.timeout(10000); 
    it('should return the correct output given input', function(done) { 
     var testCases = { 
       1: [2, 3], 
       2: [3, 4], 
       7: [8, 9], 
      }; 

     for (input in testCases) { 
      myfunc(input, function (out) { 
       var ev = testCases[input]; 
       out.should.equal(ev); 
      }); 
     } 
    }) 
}) 

這導致:

AssertionError: expected [ '11', '12' ] to be [ 2, 3 ] 
    + expected - actual 

    [ 
    + 2 
    + 3 
    - "11" 
    - "12" 
    ] 

我不知道在哪裏[ '11', '12']從何而來,但也有點線程安全問題。

任何人都可以向我解釋這些意外的價值來自哪裏?

+1

對於你的情況(比較數組)使用.eql而不是.equal(它只是===裏面)。但是.eql做了深入的比較。 –

回答

3

看來您正在傳遞給myfuncinput正被視爲String。看看這個答案。

Keys in Javascript objects can only be strings?

試試這個,

var should = require('should'); 

function myfunc(x, cb) { var y = x + 1; var z = x + 2; cb([y, z]); }; 

describe('.mymethod()', function() { 
    this.timeout(10000); 
    it('should return the correct output given input', function(done) { 
     var testCases = { 
      1: [2, 3], 
      2: [3, 4], 
      7: [8, 9], 
     }; 

     for (input in testCases) { 
      input = parseInt(input) 
      myfunc(input, function (out) { 
       var ev = testCases[input]; 
       out.should.equal(ev); 
      }); 
     } 
    }) 
}) 

在這裏,我已經解析了input它的整數值。