【发布时间】:2018-04-02 22:39:09
【问题描述】:
我在确认使用 Jest 调用我的函数时遇到了一点问题。我有两个模拟函数。一个只是模拟返回一个承诺,另一个是一个简单的间谍,应该在第一个的 then() 块中调用。
下面,在测试中,你会看到两个期望。第一个期望过去了。第二个没有。即expect(sendSpy).toHaveBeenCalled() 通过但expect(sendCallbackSpy).toHaveBeenCalled() 不通过。
但是,当我将 console.log 语句放入文件中时(如下所示),两者都执行(即“之前”和“之后”),如果我在控制台中记录 window.props.onSend,它会确认模拟函数存在。所以看起来应该调用该函数。
另外需要注意的是,我的实现要求我从window 传入props 对象中的回调。此外,要在 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()
})
【问题讨论】:
标签: javascript reactjs unit-testing jestjs enzyme