Jasmine toBeClose到底是什么第二个参数?

时间:2017-07-28 15:21:49

标签: javascript angularjs unit-testing jasmine

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

2 个答案:

答案 0 :(得分:10)

正如@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

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

答案 1 :(得分:-1)

以下是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