2017-08-11 110 views
4

有没有办法用[email protected]来测试匿名函数的相等性?使用Jest测试匿名函数的相等性

我试图通过类似的测试:

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. 
+1

这是一个黑客而不是答案。你可以尝试expect(''+ obj).toEqual(''+ foo(2))'。它比较函数字符串的内容而不是函数本身。 – Malice

+0

@Malice这并不坏,尽管第二个测试更接近我的用例,我将anon fn分配给了我想要比较的对象中的一个属性。你的方法可以作为'.toEqual'中内置的方法来检查这种类型的相等性 – bitstrider

+0

...但不幸的是,相等性不是完全准确的,因为'''+ foo(1)===''+ foo (2)“评估为真” – bitstrider

回答

2

在这种情况下,无需重写你的逻辑使用命名功能,你真的不除之外还有其他选择,例如在测试之前声明该功能,例如

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 }) 

这可能会根据测试的情况下实际上更有意义。