用 Jest 测试匿名函数相等性
Posted
技术标签:
【中文标题】用 Jest 测试匿名函数相等性【英文标题】:Testing anonymous function equality with Jest 【发布时间】:2018-01-20 11:55:08 【问题描述】:有没有办法用jest@20
测试匿名函数的相等性?
我正在尝试通过类似于以下内容的测试:
const foo = i => j => return i*j
const bar = () => baz:foo(2), boz:1
describe('Test anonymous function equality',()=>
it('+++ foo', () =>
const obj = foo(2)
expect(obj).toBe(foo(2))
);
it('+++ bar', () =>
const obj = bar()
expect(obj).toEqual(baz:foo(2), boz:1)
);
);
目前产生:
● >>>Test anonymous function equality › +++ foo
expect(received).toBe(expected)
Expected value to be (using ===):
[Function anonymous]
Received:
[Function anonymous]
Difference:
Compared values have no visual difference.
● >>>Test anonymous function equality › +++ bar
expect(received).toBe(expected)
Expected value to be (using ===):
baz: [Function anonymous], boz:1
Received:
baz: [Function anonymous], boz:1
Difference:
Compared values have no visual difference.
【问题讨论】:
这是一个技巧,而不是一个答案。你可以试试expect(''+obj).toEqual(''+foo(2))
。它比较的是函数字符串的内容,而不是函数本身。
@Malice 这还不错,虽然第二个测试更接近我的用例,我将 anon fn 分配给我想要比较的对象中的一个属性。您的方法可以作为 .toEqual
中选择的内置方法来检查这种类型的相等性
...但不幸的是,相等性并不完全准确,因为 ''+foo(1) === ''+foo(2)
的计算结果为 true
【参考方案1】:
在这种情况下,如果不重写逻辑以使用命名函数,除了在测试之前声明函数之外,您实际上别无选择,例如
const foo = i => j => i * j
const foo2 = foo(2)
const bar = () => ( baz: foo2, boz: 1 )
describe('Test anonymous function equality', () =>
it('+++ bar', () =>
const obj = bar()
expect(obj).toEqual( baz: foo2, boz: 1 )
);
);
或者,您可以检查obj.bar
是否是任何函数,使用expect.any(Function)
:
expect(obj).toEqual( baz: expect.any(Function), boz: 1 )
这实际上可能更有意义,具体取决于测试的上下文。
【讨论】:
谢谢你的答案,你的替代方法对我的测试来说已经足够了!expect(result).toEqual( getFooData: expect.any(Function), foo: 'some foo string' )
以上是关于用 Jest 测试匿名函数相等性的主要内容,如果未能解决你的问题,请参考以下文章
Python匿名函数lambda是什么?为什么要匿名?怎么用?