在Mocha测试中使用for循环

B. *_*wok 4 javascript for-loop mocha.js node.js

我是mocha的新手,我想尝试使用for循环来创建测试用例.我想测试一个我所做的功能,它输入标准的12小时时间,然后输出到24小时的军事时间.这就是它的样子.

exports.main = function(time) {
var hr = parseInt(time.substr(0,2));
var period = time.substr(8,10);
if (period == 'AM' && hr == 12) {
    hr = '0';
}
if (period == 'PM' && hr < 12) {
           hr += 12;
}
    hr.toString();
    if (hr < 10) {
        hr = '0' + hr;
    }
 return time = time.replace(/^\d{2}/g, hr).substr(0,8);

}
Run Code Online (Sandbox Code Playgroud)

为了在mocha中测试我的函数,我有两个数组,一个数组保持标准时间,另一个数组保持相应的预期输出.我想迭代它们并为每次迭代生成一个测试用例并测试我的函数.

test_array = ["12:00:00AM", "01:00:00AM", "02:00:00AM", "03:00:00AM", "04:00:00AM",
"05:00:00AM", "06:00:00AM", "07:00:00AM", "08:00:00AM", "09:00:00AM",
"10:00:00AM", "11:00:00AM", "12:00:00PM", "01:00:00PM", "02:00:00PM",
"03:00:00PM", "04:00:00PM", "05:00:00PM", "06:00:00PM", "07:00:00PM",
"08:00:00PM", "09:00:00PM", "10:00:00PM", "11:00:00PM"];

against = ["00:00:00", "01:00:00", "02:00:00", "03:00:00", "04:00:00",
"05:00:00", "06:00:00", "07:00:00", "08:00:00", "09:00:00", "10:00:00",
"11:00:00", "12:00:00", "13:00:00", "14:00:00", "15:00:00", "16:00:00",
"17:00:00", "18:00:00", "19:00:00", "20:00:00", "21:00:00", "22:00:00",
"23:00:00"]
Run Code Online (Sandbox Code Playgroud)

这是我的测试脚本的样子:

var converter = require('../modules/time.js');
describe('Time Converter', function() {
 describe('main()', function() {
  for(i = 0; i < 24; i++) {
   it(test_array[i]  + ' should convert to ' + against[i], function() {
   var test = converter.main(test_array[i]);
   assert.equal(test, against[i]);
   });
  }
 });
});
Run Code Online (Sandbox Code Playgroud)

以下是测试结果:

0 passing (23ms)
24 failing

1) Time Converter main() 12:00:00AM should convert to 00:00:00:
 TypeError: Cannot read property 'substr' of undefined
  at Object.exports.main (app/modules/time.js:43:27)
  at Context.<anonymous> (app/test/test.js:35:26)

2) - 24) has the same result:

24) Time Converter main() 11:00:00PM should convert to 23:00:00:
 TypeError: Cannot read property 'substr' of undefined
  at Object.exports.main (app/modules/time.js:43:27)
  at Context.<anonymous> (app/test/test.js:35:26)
Run Code Online (Sandbox Code Playgroud)

但是,当我将for循环更改为

for(i = 0; i < 23; i++)
Run Code Online (Sandbox Code Playgroud)

所有测试都通过,但自然不会测试最后一个测试用例.

Time Converter
main()
  ? 12:00:00AM should convert to 00:00:00
  ? 01:00:00AM should convert to 01:00:00
  ? 02:00:00AM should convert to 02:00:00
  ? 03:00:00AM should convert to 03:00:00
  ? 04:00:00AM should convert to 04:00:00
  ? 05:00:00AM should convert to 05:00:00
  ? 06:00:00AM should convert to 06:00:00
  ? 07:00:00AM should convert to 07:00:00
  ? 08:00:00AM should convert to 08:00:00
  ? 09:00:00AM should convert to 09:00:00
  ? 10:00:00AM should convert to 10:00:00
  ? 11:00:00AM should convert to 11:00:00
  ? 12:00:00PM should convert to 12:00:00
  ? 01:00:00PM should convert to 13:00:00
  ? 02:00:00PM should convert to 14:00:00
  ? 03:00:00PM should convert to 15:00:00
  ? 04:00:00PM should convert to 16:00:00
  ? 05:00:00PM should convert to 17:00:00
  ? 06:00:00PM should convert to 18:00:00
  ? 07:00:00PM should convert to 19:00:00
  ? 08:00:00PM should convert to 20:00:00
  ? 09:00:00PM should convert to 21:00:00
  ? 10:00:00PM should convert to 22:00:00
  23 passing (14ms)
Run Code Online (Sandbox Code Playgroud)

但是,当我自己测试最后一个测试用例时,它会通过.

? 11:00:00PMshould convert to 23:00:00
Run Code Online (Sandbox Code Playgroud)

所以,我很困惑为什么如果for循环遍历整个数组,所有测试都不起作用,但是如果我迭代直到最后一个索引,则会起作用.有人可以为我清除这个吗?

Joh*_*erz 10

您的代码可能是同步的,但是mocha将其称为异步.意思是:你的描述被解析同步,mocha存储这些信息并在它自己的上下文中运行每个测试.这是异步的.要使其工作,您必须使用函数创建一个闭包:

var converter = require('../modules/time.js');
// outside the loop:
function itShouldTestArray(i) {
   // i is now within the function scope and won't change anymore
   it(test_array[i]  + ' should convert to ' + against[i], function() {
   var test = converter.main(test_array[i]);
   assert.equal(test, against[i]);
}
describe('Time Converter', function() {
 describe('main()', function() {
  for(i = 0; i < 24; i++) {
   itShouldTestArray(i);
   });
  }
 });
});
Run Code Online (Sandbox Code Playgroud)