如何在JavaScript / Jasmine中测试随机功能?

How to test random functionality in JavaScript/Jasmine?

我有一个简短的函数,它获取一个数组,并将值"四处"移动。

1
array_name.sort(function() { return 0.5 - Math.random() });

如何测试我得到的阵列与以前不同?

当然,我可以模拟数组,然后测试

1
array_name[2] != array_after[2];

但是,由于它是随机的,有时这个位置是相等的,有时不是。

什么是一个好方法?

所以,它是关于测试随机性

我有办法,当然我的问题是:

1
2
3
4
5
6
7
it('different option order when randomization is true', function() {
  var array = // getting from json.file here
  var array_after = question.shuffle(array);

  expect(array[4].text.localeCompare(array_after[1].text)).toBe(0);

});

当然,现在我不能说这总是不同的。因为我多次运行我的测试,有时它们是相同的,有时不是…


你想要的是一个种子随机数生成器。在您的测试中,您可以控制种子并验证不同的种子是否始终生成不同的数字。

有关详细信息,请参阅http://indiegamr.com/generate-repeatable-random-numbers-in-js/。

相关问题:

  • 在javascript中播种随机数生成器
  • javascript中的可种子随机数生成器


如果需要比较前后数组是否确实不同,请执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
function arraysAreEqual(before, after){
    if(before.length !== after.length){
        return false;
    }
    for(var i = 0; i < before.length; i++){
        if(before[i] !== after[i]){
            return false;
        }
    }
    return true;
}

根据数组的内容,您可能需要修改for循环中的相等检查,以说明嵌套的数组/对象。

假设:

1
2
3
4
var myArray = [
    {text: 'foo', value: 1},
    {text: 'bar', value: 2}
]

您可以使用它,例如:

1
2
3
4
if(before[i].text !== after[i].text ||
   before[i].value !== after[i].value){
    return false;
}

使用此功能,您应该能够使用:

1
expect(arraysAreEqual(array, array_after)).toBe(false);

然而,测试用例将在(不可能,但可能)的情况下失败,随机化器返回与输入相同的数组。