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; } |
根据数组的内容,您可能需要修改
假设:
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); |
。
然而,测试用例将在(不可能,但可能)的情况下失败,随机化器返回与输入相同的数组。