使用Jest测试匿名函数的相等性

68
有没有办法在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.

3
这只是一个技巧而不是答案。你可以尝试使用 expect(''+obj).toEqual(''+foo(2)),它比较的是函数字符串内容而不是函数本身。 - Malice
@Malice 这不错,尽管第二个测试更接近我的用例,其中我将匿名函数分配给我想要比较的对象中的属性。您的方法可以作为.toEqual内置方法来检查此类型的相等性。 - strider
但不幸的是,相等并不完全准确,因为 ''+foo(1) === ''+foo(2) 的值为 true。 - strider
1个回答

107
在这种情况下,如果不重写您的逻辑以使用命名函数,您实际上没有其他选择,除了在测试之前声明该函数,例如:
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 })
  });    
});

或者,你可以使用expect.any(Function)检查obj.bar是否是任何函数:

expect(obj).toEqual({ baz: expect.any(Function), boz: 1 })

根据测试的背景,这可能更有意义。


19
谢谢回答,你提供的替代方法对我的测试来说已经足够了!expect(result).toEqual({ getFooData: expect.any(Function), foo: 'some foo string' }) - teberl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接