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

时间:2014-04-30 08:21:37

标签: javascript jasmine

我有一个简短的函数,可以获取一个数组并随机播放值""。

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

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

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

array_name[2] != array_after[2];

但是,随着它的随机性,有时候这个位置是平等的,有时候不是。

对此有什么好处?


所以,关于测试随机性

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

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

});

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

2 个答案:

答案 0 :(得分:3)

您所追求的是种子随机数生成器。在您的测试中,您可以控制种子并验证不同的种子始终生成不同的数字。

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

相关问题:

答案 1 :(得分:-1)

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

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循环中的相等性检查以考虑嵌套数组/对象。

假设:

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

您可以使用此功能,例如:

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

使用此功能,您应该可以使用:

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

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