Dan*_*scu 5 javascript unit-testing jestjs
我正在测试一个对象与一组字段匹配,但是其中一个是浮点,我需要使用.toBeCloseTo。怎么能不出所料?
expect(foo).toMatchObject({
bar: 'baz',
value: ???.toBeCloseTo(5), // TODO
});
Run Code Online (Sandbox Code Playgroud)
我可以使用expect(foo.value).toBeCloseTo(5),但是我不想将逻辑分为多个expects,每个浮点数一个。
在对文档toMatchObject状态“您可以对值或反对的匹配匹配属性”。
不幸的是,toBeCloseTo当前不可用作非对称匹配器,看起来这些是Jest当前提供的唯一非对称匹配器。
如果您使用的是Jest v23或更高版本,则可以创建自己的副本,基本上可以toBeCloseTo使用expect.extend以下命令进行复制:
expect.extend({
toBeAround(actual, expected, precision = 2) {
const pass = Math.abs(expected - actual) < Math.pow(10, -precision) / 2;
if (pass) {
return {
message: () => `expected ${actual} not to be around ${expected}`,
pass: true
};
} else {
return {
message: () => `expected ${actual} to be around ${expected}`,
pass: false
}
}
}
});
const foo = {
bar: 'baz',
value: 4.9999
};
test('foo', () => {
expect(foo.value).toBeAround(5, 3); // SUCCESS in Jest > v20
expect(foo).toMatchObject({
bar: 'baz',
value: expect.toBeAround(5, 3) // SUCCESS only in Jest > v23
});
});
Run Code Online (Sandbox Code Playgroud)
请注意,将expect.extend创建一个可在toMatchObject仅在Jest v23及更高版本中的函数中使用的匹配器。
Jest合作者在这篇文章中写道:“尽管暗示但目前没有记录,但Jest断言评估了Jasmine中定义的不对称匹配器对象”。
可以使用如下所示的逻辑toBeCloseTo来创建不对称匹配器:
const closeTo = (expected, precision = 2) => ({
asymmetricMatch: (actual) => Math.abs(expected - actual) < Math.pow(10, -precision) / 2
});
const foo = {
bar: 'baz',
value: 4.9999
};
test('foo', () => {
expect(foo).toMatchObject({
bar: 'baz',
value: closeTo(5, 3) // SUCCESS
});
});
Run Code Online (Sandbox Code Playgroud)