【问题标题】:Jasmine toBeCloseTo what is second parameter?Jasmine toBeCloseTo 第二个参数是什么?
【发布时间】:2017-07-28 15:21:48
【问题描述】:

Jasmine 的文档很短;通常就足够了。并非总是如此。

我想知道toBeCloseTo的第二个参数到底是什么。官方参考仅供参考:

it("The 'toBeCloseTo' matcher is for precision math comparison", function() {
    var pi = 3.1415926, e = 2.78;
    expect(pi).not.toBeCloseTo(e, 2);
    expect(pi).toBeCloseTo(e, 0);
});

好的,它是精确的,但在这种情况下,“精确”实际上意味着什么?是“。”后面的位数吗?应该是一样的吧?

我的情况:我想以毫秒为单位比较两个时间戳;如果它们之间的差异小于100,那对我来说很好。

例如,在以下情况下,X 的值是多少?

var timestamp1 = 1501254807000;
var timestamp2 = 1501254807099;
var timestamp3 = 1501254807100;
var precision = X;
expect(timestamp1).toBeCloseTo(timestamp2, precision); //this should pass
expect(timestamp1).toBeCloseTo(timestamp3, precision); //this should NOT pass

如果精度只针对十进制数,我可以将整数除以 1000 得到十进制数,但无论如何,我不知道 X 是什么。 目前,我是这样做的:

 expect(Math.abs(timestamp2-timestamp1)).toBeLessThan(100);

但它的可读性不是很好,我想使用 toBeCloseTo(因为它存在...)。

谢谢


编辑。以下结果可能会有所帮助:

expect(1000000.005).toBeCloseTo(1000000.000,3); //fails
expect(1000000.005).toBeCloseTo(1000000.000,2); //fails
expect(1000000.005).toBeCloseTo(1000000.000,1); //pass

【问题讨论】:

  • 文档说“要检查的小数点数。”
  • 顺便说一句,我添加了一个新示例,这似乎与 Nikolaj 报告的文档不相符
  • 谷歌给我带来了:jasmine.github.io/2.0/introduction.html - 这是我知道的关于 Jasmine 的唯一文档/参考 :) 无论如何他们给出的例子(我在我的问题)至少很奇怪。有人可能会问为什么,如果精度为 2,则示例中的变量 pi 和 e 不接近,而如果精度为 0,则它们接近。 @fatLewis 查看源代码?文档应该做得很好,为了不需要查看这些细节的来源,我认为......
  • 我通常会同意文档,但匹配器代码非常短(不到 40 行)并且有 JSDoc 标签。我稍后会写一个答案,但@Nikolaj 是正确的。

标签: javascript angularjs unit-testing jasmine


【解决方案1】:

正如@Nikolaj 所说,“precision”参数指定匹配器检查精度的小数位数,并进行四舍五入。

对于您给出的示例,前两个断言失败,因为分别在小数点后 3 位和小数点后 2 位发现数字不同(在小数点后 2 位,尾随的 05 舍入为 1)。小数点后 1 位数字相同。

匹配器确实接受负精度值,例如:

expect(1000).toBeCloseTo(1003,-1); //pass
expect(1000).toBeCloseTo(1100,-2); //fail
expect(1000).toBeCloseTo(1100,-3); //pass

但除此之外它不是很可调。遗憾的是,这确实意味着匹配器不适合您的目的,因此您可能会坚持使用建议的解决方案。

【讨论】:

  • 详细解释,谢谢。但是 Jasmine 最好不要在比较之前对每个值进行四舍五入,这基本上会迫使用户指定少一位数的精度。
【解决方案2】:

这是来自 Jest 文档的示例,它帮助我更好地理解 toBeCloseTo 匹配器的价值。

expect(0.1+0.2).toBe(0.3); // fails becouse it's 0.30000000000000004
expect(0.1+0.2).toBeCloseTo(0.3); // pass

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 2016-10-05
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2012-05-04
    • 2012-12-09
    相关资源
    最近更新 更多