用玩笑检查传递的功能作为道具

时间:2019-02-11 10:11:31

标签: javascript unit-testing jestjs enzyme

react-dates构建组件,我有类似的东西:

<DayPickerRangeController
    // some props...
    isDayBlocked={day => isDayBlocked(a, someObject)}
/>

我想测试我是否正确传递了day => isDayBlocked(a, someObject)格式的函数。

所以在我的测试中,我有:

import isDayBlocked from './isDayBlocked'

jest.mock('./isDayBlocked', () => () => {})

然后进行测试:

expect(wrapper.find(DayPickerRangeController).props().isDayBlocked).toBe(
      () => isDayBlocked,
);

但是我收到:

expect(received).toBe(expected) // Object.is equality

Expected: [Function anonymous]
Received: [Function isDayBlocked]

我如何通过测试?

1 个答案:

答案 0 :(得分:1)

您正在尝试匹配函数的主体。这种方式行不通。您可以比较.toString()的结果,但可以肯定的是,这并不意味着相同的正文文本意味着相同的执行(由于使用了闭包/全局变量)。

那你能做什么?

您可以像其他任何函数一样测试要传入的函数:提供不同的输入并针对输出进行断言。

wrapper.callSomethingToChangeState();
expect(wrapper.find(DayPickerRangeController).props().isDayBlocked('day1'))
    .toBeFalsy();
expect(wrapper.find(DayPickerRangeController).props().isDayBlocked('day2'))
    .toBeFalsy();
expect(wrapper.find(DayPickerRangeController).props().isDayBlocked('day3'))
    .toBeTruthy();

如果您的isDayBlocked依赖于组件的某些内部状态,则您可能想组成几个不同的it()来涵盖不同的输入数据类