【问题标题】:How to write up a unit test in Jasmine for a random outcome? (eg Dice Throw)如何在 Jasmine 中编写单元测试以获得随机结果? (例如掷骰子)
【发布时间】:2015-07-01 05:54:47
【问题描述】:

如何根据随机结果生成器编写 Jasmine 单元测试?

例如,如何围绕随机掷骰子(或颜色选择器,或天气设置,如果它是一个字符串)的结果编写测试?

骰子代码本身是这样的:

Dice.prototype.rollDice = function() {
1 + Math.floor(Math.random() * 6);
};

而且我知道下面写的内容是不正确/不完整的,我只是把它写成我卡住的一个例子:

it("can generate a random number from the players throw", function() {
var dice = new Dice();
dice.rollDice();
expect(----------------------).toEqual(----------------);
});

我对 Jasmine 单元测试几乎没有经验,希望能有一个完整的工作示例演示

非常感谢

【问题讨论】:

  • 可能是 META,但我建议跳过测试这类事情。你可以打赌,Math 包已经过死测试,检查它的结果实际上是随机的没有多大意义。无论如何都没有办法做到这一点,考虑到无论如何你都无法说出最终要滚动的内容。
  • 如果结果在1到6之间我只能考虑测试
  • @FelipeSkinner 是的,但是当您在测试中编写断言时,您需要精确。您当然可以检查某个值是否介于 1 和 6 之间,但不可能检查 1 和 6 之间的值,因为您需要在编写测试时提前知道。所以提问者只能检查一系列值,而不是特定值。
  • 怎么回事?我不能写expect({rolled value}).toBeGreaterThan(0)expect({rolled value}).toBeLessThan(7) 吗?

标签: javascript unit-testing testing jasmine


【解决方案1】:

您可以在 Google 上搜索“如何测试随机性”,但正如 @radicalmatt 所说,您只是不在您的应用程序中测试这种行为,或者至少不作为常规测试套件的一部分。

如果我要为应该给出 1 到 6 随机数的“骰子”编写代码,我会在编写代码后手动测试它,但我不会编写自动化测试。也就是说,我会编写一个小程序,将rollDice() 执行一百万次,然后输出每个结果的相对频率。我希望结果只包括数字 1 到 6,并且我希望所有频率都舒适地接近 16。如果我对结果感到满意,我会认为它已经过测试。我可能会添加一条评论,例如“如果您修改它,请记住测试此代码”。

【讨论】:

    【解决方案2】:

    我会把它写成两个期望:

    expect({rolled value}).toBeGreaterThan(0);
    expect({rolled value}).toBeLessThan(7);
    

    【讨论】:

    • 这个建议奏效了,写成这样:expect(dice.dieFace).toBeGreaterThan(0);期望(骰子.dieFace).toBeLessThan(7);你对字符串有什么建议吗? - 很抱歉,我没有足够的分数来支持您的建议,但仍然感谢您
    • 尝试类似:expect(['these', 'are', 'the', 'valid', 'options']).toContain(actualValue);
    【解决方案3】:

    只是不要在测试中使用math.random。模拟它/重构并测试其他所有内容。例如,您应该测试 math.random 是否有任何可能(一些边缘情况)输出,您的 rollDice 函数仍然产生有效结果

    【讨论】:

      猜你喜欢
      • 2021-07-11
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      相关资源
      最近更新 更多