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

问题描述 投票:3回答:2

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
javascript angularjs unit-testing jasmine
2个回答
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
投票

以下是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
© www.soinside.com 2019 - 2024. All rights reserved.