diff --git a/components/tooltip/__tests__/tooltip.test.js b/components/tooltip/__tests__/tooltip.test.js
new file mode 100644
index 000000000..f104c0e9f
--- /dev/null
+++ b/components/tooltip/__tests__/tooltip.test.js
@@ -0,0 +1,215 @@
+import { asyncExpect } from '@/tests/utils'
+import { mount } from '@vue/test-utils'
+import Tooltip from '..'
+import Button from '../../button'
+
+describe('Tooltip', () => {
+ it('check `onVisibleChange` arguments', async () => {
+ const onVisibleChange = jest.fn()
+ const wrapper = mount({
+ props: ['title', 'visible'],
+ render () {
+ const props = {
+ props: {
+ title: this.title || '',
+ mouseEnterDelay: 0,
+ mouseLeaveDelay: 0,
+ },
+ on: {
+ visibleChange: onVisibleChange,
+ },
+ }
+ if (this.visible !== undefined) {
+ props.props.visible = this.visible
+ }
+ return
+ Hello world!
+
+ },
+ }, { sync: false })
+
+ let div = null
+ let lastCount = null
+ await asyncExpect(() => {
+ // `title` is empty.
+ div = wrapper.findAll('#hello').at(0)
+ div.trigger('mouseenter')
+ })
+ await asyncExpect(() => {
+ expect(onVisibleChange).not.toHaveBeenCalled()
+ expect(wrapper.vm.$refs.tooltip.$refs.tooltip.visible).toBe(false)
+ })
+ await asyncExpect(() => {
+ div.trigger('mouseleave')
+ })
+ await asyncExpect(() => {
+ expect(onVisibleChange).not.toHaveBeenCalled()
+ expect(wrapper.vm.$refs.tooltip.$refs.tooltip.visible).toBe(false)
+ })
+ await asyncExpect(() => {
+ // update `title` value.
+ wrapper.setProps({ title: 'Have a nice day!' })
+ })
+ await asyncExpect(() => {
+ wrapper.findAll('#hello').at(0).trigger('mouseenter')
+ })
+ await asyncExpect(() => {
+ expect(onVisibleChange).toHaveBeenLastCalledWith(true)
+ expect(wrapper.vm.$refs.tooltip.$refs.tooltip.visible).toBe(true)
+ }, 0)
+ await asyncExpect(() => {
+ wrapper.find('#hello').trigger('mouseleave')
+ })
+ await asyncExpect(() => {
+ expect(onVisibleChange).toHaveBeenLastCalledWith(false)
+ expect(wrapper.vm.$refs.tooltip.$refs.tooltip.visible).toBe(false)
+ })
+ await asyncExpect(() => {
+ // add `visible` props.
+ wrapper.setProps({ visible: false })
+ })
+ await asyncExpect(() => {
+ wrapper.find('#hello').trigger('mouseenter')
+ })
+ await asyncExpect(() => {
+ expect(onVisibleChange).toHaveBeenLastCalledWith(true)
+ lastCount = onVisibleChange.mock.calls.length
+ expect(wrapper.vm.$refs.tooltip.$refs.tooltip.visible).toBe(false)
+ })
+ await asyncExpect(() => {
+ // always trigger onVisibleChange
+ wrapper.trigger('mouseleave')
+ })
+ await asyncExpect(() => {
+ expect(onVisibleChange.mock.calls.length).toBe(lastCount) // no change with lastCount
+ expect(wrapper.vm.$refs.tooltip.$refs.tooltip.visible).toBe(false)
+ })
+ await asyncExpect(() => {
+
+ })
+ })
+
+ // it('should hide when mouse leave native disabled button', () => {
+ // const onVisibleChange = jest.fn()
+ // const wrapper = mount(
+ //
+ //
+ //
+ // )
+
+ // expect(wrapper.find('span')).toHaveLength(1)
+ // const button = wrapper.find('span').at(0)
+ // button.dispatchEvent(new MouseEvent('mouseenter'))
+ // expect(onVisibleChange).toBeCalledWith(true)
+ // expect(wrapper.vm.$refs.tooltip.$refs.tooltip.visible).toBe(true)
+
+ // button.trigger('mouseleave')
+ // expect(onVisibleChange).toBeCalledWith(false)
+ // expect(wrapper.vm.$refs.tooltip.$refs.tooltip.visible).toBe(false)
+ // })
+
+ // it('should hide when mouse leave antd disabled Button', () => {
+ // const onVisibleChange = jest.fn()
+ // const wrapper = mount(
+ //
+ //
+ //
+ // )
+
+ // expect(wrapper.render()).toMatchSnapshot()
+ // const button = wrapper.find('span').at(0)
+ // button.dispatchEvent(new MouseEvent('mouseenter'))
+ // expect(onVisibleChange).toBeCalledWith(true)
+ // expect(wrapper.vm.$refs.tooltip.$refs.tooltip.visible).toBe(true)
+
+ // button.trigger('mouseleave')
+ // expect(onVisibleChange).toBeCalledWith(false)
+ // expect(wrapper.vm.$refs.tooltip.$refs.tooltip.visible).toBe(false)
+ // })
+
+ // it('should render disabled Button style properly', () => {
+ // const wrapper1 = mount(
+ //
+ //
+ //
+ // )
+ // const wrapper2 = mount(
+ //
+ //
+ //
+ // )
+ // expect(wrapper1.find('span').at(0).element.style.display).toBe('inline-block')
+ // expect(wrapper2.find('span').at(0).element.style.display).toBe('block')
+ // })
+
+ // it('should not wrap span when trigger is not hover', () => {
+ // const wrapper = mount(
+ //
+ //
+ //
+ // )
+
+ // expect(wrapper.find('span')).toHaveLength(0)
+ // })
+
+ // it('should works for arrowPointAtCenter', () => {
+ // const arrowWidth = 5
+ // const horizontalArrowShift = 16
+ // const triggerWidth = 200
+
+ // const suit = () => {
+ // const wrapper = mount(
+ //
+ //
+ //
+ // )
+ // wrapper.find('button').at(0).trigger('click')
+ // const popupLeftDefault = parseInt(wrapper.instance().getPopupDomNode().style.left, 10)
+
+ // const wrapper2 = mount(
+ //
+ //
+ //
+ // )
+ // wrapper2.find('button').at(0).trigger('click')
+ // const popupLeftArrowPointAtCenter = parseInt(wrapper2.instance().getPopupDomNode().style.left, 10)
+ // expect(popupLeftArrowPointAtCenter - popupLeftDefault).toBe((triggerWidth / 2) - horizontalArrowShift - arrowWidth)
+ // }
+ // jest.dontMock('rc-trigger', suit)
+ // })
+})