我在确认使用Jest调用我的函数时遇到了一些麻烦。我有两个模拟功能。一个是嘲笑返回一个承诺,另一个是一个应该在第一个then()
块中调用的简单间谍。
下面,在测试中,您将看到两个期望。第一个期望过去了。第二个没有。即expect(sendSpy).toHaveBeenCalled()
通过但expect(sendCallbackSpy).toHaveBeenCalled()
没通过。
然而,当我将console.log
语句放在文件中时(如下所示),都执行(即'之前'和'之后'),如果我控制台登录window.props.onSend
它确认模拟函数存在。所以看起来应该调用该函数。
另一点需要注意的是,我的实现要求我从props
传入window
对象中的回调。此外,要在Jest中window
上模拟事物,你只需要模仿global
,就像我在下面做的那样。我不认为这与这个问题有关,但值得指出。
是否可以在then()
块中调用实际函数之前运行期望?
export class MyButton extends Component {
handleClick = () => {
this.props.send(this.props.url).then(res => {
console.log('before', window.props.onSend)
window.props.onSend(res.data)
console.log('after')
})
}
render() {
return <button onClick={handleClick} />
}
}
//test
test('it calls the identity function when button is clicked', () => {
const sendSpy = jest.fn(() => { return Promise.resolve({ data: 'hello' }) })
const sendCallbackSpy = jest.fn()
global.props = { onSend: sendCallbackSpy }
wrapper = shallow(<MyButton send={sendSpy} } />)
const button = wrapper.find('button')
button.simulate('click')
expect(sendSpy).toHaveBeenCalled()
expect(sendCallbackSpy).toHaveBeenCalled()
})
答案 0 :(得分:1)
在测试第二个间谍之前,你需要等待承诺:
test('it calls the identity function when button is clicked', async() => {
const request = Promise.resolve({ data: 'hello' })
const sendSpy = jest.fn(() => request)
const sendCallbackSpy = jest.fn()
global.props = { onSend: sendCallbackSpy }
wrapper = shallow(<MyButton send={sendSpy} } />)
const button = wrapper.find('button')
button.simulate('click')
expect(sendSpy).toHaveBeenCalled()
await request
expect(sendCallbackSpy).toHaveBeenCalled()
})