用 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是什么?为什么要匿名?怎么用?

272 函数的理解和使用:回调函数,匿名函数自调用IIFE,**函数中的this**

使用匿名函数进行PHPUnit测试

回调匿名函数和闭包

匿名函数