Skip to content

Commit

Permalink
🎉 完成Menu测试并修复部分bug
Browse files Browse the repository at this point in the history
  • Loading branch information
Hoofoo-WHU committed Mar 4, 2019
1 parent 135ec8c commit fa1e38c
Show file tree
Hide file tree
Showing 4 changed files with 229 additions and 17 deletions.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@
"postcss": "^7.0.14",
"postcss-loader": "^3.0.0",
"prop-types": "^15.7.2",
"react": "^16.7.0",
"react": "^16.8.3",
"react-dom": "^16.7.0",
"sass-loader": "^7.1.0",
"sinon": "^7.2.4",
Expand All @@ -110,4 +110,4 @@
"webpack-dev-server": "^3.1.14",
"webpack-merge": "^4.2.1"
}
}
}
7 changes: 5 additions & 2 deletions src/component/Menu/Menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,13 @@ class Menu extends React.Component<Menu.Props>{
static ItemGroup: ItemGroup
static propTypes: React.ValidationMap<Menu.Props> = {
activeName: PropTypes.string.isRequired,
opens: PropTypes.arrayOf(PropTypes.string).isRequired,
opens: PropTypes.arrayOf(PropTypes.string),
className: PropTypes.string,
style: SemonPropTypes.style
}
static defaultProps = {
opens: []
}

render() {
const { className, style, children, activeName, opens } = this.props
Expand All @@ -49,7 +52,7 @@ class Menu extends React.Component<Menu.Props>{
namespace Menu {
export interface Props extends React.Props<{}> {
activeName: string
opens: string[]
opens?: string[]
onChange?: (name: string) => void
onOpenChange?: (opens: string[]) => void
className?: string
Expand Down
217 changes: 217 additions & 0 deletions test/Menu.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
import { Menu } from '../src'
import * as Mock from 'mockjs'
import * as React from 'react'
import * as ReactDOM from 'react-dom'
import * as sinon from 'sinon'
import styled from '@/style/component/Menu/Menu.scss'
import styledItem from '@/style/component/Menu/Item.scss'
import styledSub from '@/style/component/Menu/SubMenu.scss'
import styledGroup from '@/style/component/Menu/ItemGroup.scss'
import { Simulate } from 'react-dom/test-utils'

chai.should()

describe('Menu', () => {
let container: HTMLDivElement

beforeEach(() => {
container = document.createElement('div')
document.body.appendChild(container)
})

afterEach(() => {
container.remove()
container = null
})

it('可以导入', () => {
Menu.should.exist
})

it('可以设置className', () => {
const className = Mock.Random.word(3, 8)
ReactDOM.render(<Menu className={className} activeName='1' />, container)
container.querySelector(`.${styled.menu}`).classList.contains(className).should.be.ok
})

it('可以设置style', () => {
const style: React.CSSProperties = { color: Mock.Random.rgb(), height: `${Mock.Random.natural(0, 100)}px` }
ReactDOM.render(<Menu style={style} activeName='1' opens={[]} />, container)
const menu: HTMLElement = container.querySelector(`.${styled.menu}`)
menu.style.color.should.equal(style.color)
menu.style.height.should.equal(style.height)
})

it('可以设置触发onChange', () => {
const fake = sinon.fake()
const name = Mock.Random.word(3, 5)
ReactDOM.render(<Menu activeName='2' onChange={fake}>
<Menu.Item name={name}></Menu.Item>
<Menu.Item name='2'></Menu.Item>
</Menu>, container)
Simulate.click(container.querySelector(`.${styledItem['menu-item']}`))
fake.should.has.been.calledWith(name)
})

it('可以设置触发onOpenChange', () => {
const fake = sinon.fake()
const name = Mock.Random.word(3, 5)
ReactDOM.render(<Menu activeName='2' onOpenChange={fake}>
<Menu.SubMenu name={name} title='title'>
<Menu.Item name='2'></Menu.Item>
</Menu.SubMenu>
</Menu>, container)
Simulate.click(container.querySelector(`.${styledSub.title}`))
fake.should.has.been.calledWith([name])
})

describe('Menu.SubMenu', () => {
it('可以导入', () => {
Menu.SubMenu.should.exist
})

it('可以设置className', () => {
const className = Mock.Random.word(3, 8)
ReactDOM.render(<Menu activeName='1'>
<Menu.SubMenu className={className} name='1' title='1'>
</Menu.SubMenu>
</Menu>, container)
container.querySelector(`.${styledSub['menu-submenu']}`).classList.contains(className).should.be.ok
})

it('可以设置style', () => {
const style: React.CSSProperties = { color: Mock.Random.rgb(), width: `${Mock.Random.natural(0, 100)}px` }
ReactDOM.render(<Menu activeName='1'>
<Menu.SubMenu name='1' title='1' style={style}></Menu.SubMenu>
</Menu>, container)
const menu: HTMLElement = container.querySelector(`.${styledSub['menu-submenu']}`)
menu.style.color.should.equal(style.color)
menu.style.width.should.equal(style.width)
})

it('可以设置open', () => {
ReactDOM.render(<Menu activeName='1' opens={['1']}>
<Menu.SubMenu name='1' title='1'></Menu.SubMenu>
</Menu>, container)
const menu: HTMLElement = container.querySelector(`.${styledSub['menu-submenu']}`)
menu.classList.contains(styledSub.active).should.be.ok
})

it('可以设置disabled', () => {
ReactDOM.render(<Menu activeName='1' opens={['1']}>
<Menu.SubMenu name='1' title='1' disabled></Menu.SubMenu>
</Menu>, container)
const menu: HTMLElement = container.querySelector(`.${styledSub['menu-submenu']}`)
menu.classList.contains(styledSub.disabled).should.be.ok
})

it('可以open传递', () => {
const fake = sinon.fake()
ReactDOM.render(<Menu activeName='1' opens={['1']} onOpenChange={fake}>
<Menu.SubMenu name='1' title='1'>
<Menu.SubMenu name='2' title='2' />
</Menu.SubMenu>
</Menu>, container)
const menu: HTMLElement = container.querySelector(`.${styledSub['menu-submenu']} .${styledSub['menu-submenu']}`)
Simulate.click(menu.querySelector(`.${styledSub.title}`))
fake.should.has.been.calledWith(['2', '1'])
})

it('可以关闭open', (done) => {
const fake = sinon.fake()
function Demo() {
const [opens, setOpens] = React.useState(['1'])
return <Menu activeName='1' opens={opens} onOpenChange={(opens) => { setOpens(opens); fake(opens) }}>
<Menu.SubMenu name='1' title='1'>
<Menu.Item name='2'></Menu.Item>
</Menu.SubMenu>
</Menu>
}
ReactDOM.render(<Demo></Demo>, container)
const menu: HTMLElement = container.querySelector(`.${styledSub['menu-submenu']}`)
Simulate.click(menu.querySelector(`.${styledItem['menu-item']}`))
Simulate.click(menu.querySelector(`.${styledSub.title}`))
fake.should.has.been.calledWith([])
setTimeout(() => {
Simulate.click(menu.querySelector(`.${styledSub.title}`))
setTimeout(done, 301)
}, 0)
})
})

describe('Menu.Item', () => {
it('可以导入', () => {
Menu.Item.should.exist
})

it('可以设置className', () => {
const className = Mock.Random.word(3, 8)
ReactDOM.render(<Menu activeName='1'>
<Menu.Item className={className} name='1'>
</Menu.Item>
</Menu>, container)
container.querySelector(`.${styledItem['menu-item']}`).classList.contains(className).should.be.ok
})

it('可以设置style', () => {
const style: React.CSSProperties = { color: Mock.Random.rgb(), width: `${Mock.Random.natural(0, 100)}px` }
ReactDOM.render(<Menu activeName='1'>
<Menu.Item name='1' style={style}></Menu.Item>
</Menu>, container)
const item: HTMLElement = container.querySelector(`.${styledItem['menu-item']}`)
item.style.color.should.equal(style.color)
item.style.width.should.equal(style.width)
})

it('可以触发change', () => {
const fake = sinon.fake()
ReactDOM.render(<Menu activeName='1' onChange={fake}>
<Menu.Item name='1'></Menu.Item>
</Menu>, container)
const item = container.querySelector(`.${styledItem['menu-item']}`)
Simulate.click(item)
fake.should.has.been.calledWith('1')
})

it('可以设置disabled', () => {
const fake = sinon.fake()
ReactDOM.render(<Menu activeName='1' onChange={fake}>
<Menu.Item name='1' disabled></Menu.Item>
</Menu>, container)
const item = container.querySelector(`.${styledItem['menu-item']}`)
item.classList.contains(styledSub.disabled).should.be.ok
Simulate.click(item)
fake.should.has.not.been.called
})
})

describe('Menu.ItemGroup', () => {
it('可以导入', () => {
Menu.ItemGroup.should.exist
})

it('可以设置className', () => {
const className = Mock.Random.word(3, 8)
ReactDOM.render(<Menu activeName='1'>
<Menu.ItemGroup title='123' className={className}>
<Menu.Item name='1'>
</Menu.Item>
</Menu.ItemGroup>
</Menu>, container)
container.querySelector(`.${styledGroup['menu-item-group']}`).classList.contains(className).should.be.ok
})

it('可以设置style', () => {
const style: React.CSSProperties = { color: Mock.Random.rgb(), width: `${Mock.Random.natural(0, 100)}px` }
ReactDOM.render(<Menu activeName='1'>
<Menu.ItemGroup title='123' style={style}>
<Menu.Item name='1'>
</Menu.Item>
</Menu.ItemGroup>
</Menu>, container)
const group: HTMLElement = container.querySelector(`.${styledGroup['menu-item-group']}`)
group.style.color.should.equal(style.color)
group.style.width.should.equal(style.width)
})
})
})
18 changes: 5 additions & 13 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -6834,15 +6834,15 @@ react-is@^16.8.1:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.3.tgz#4ad8b029c2a718fc0cfc746c8d4e1b7221e5387d"
integrity sha512-Y4rC1ZJmsxxkkPuMLwvKvlL1Zfpbcu+Bf4ZigkHup3v9EfdYhAlWAaVyA19olXq2o2mGn0w+dFKvk3pVVlYcIA==

react@^16.7.0:
version "16.7.0"
resolved "http://registry.npm.taobao.org/react/download/react-16.7.0.tgz#b674ec396b0a5715873b350446f7ea0802ab6381"
integrity sha1-tnTsOWsKVxWHOzUERvfqCAKrY4E=
react@^16.8.3:
version "16.8.3"
resolved "https://registry.yarnpkg.com/react/-/react-16.8.3.tgz#c6f988a2ce895375de216edcfaedd6b9a76451d9"
integrity sha512-3UoSIsEq8yTJuSu0luO1QQWYbgGEILm+eJl2QN/VLDi7hL+EN18M3q3oVZwmVzzBJ3DkM7RMdRwBmZZ+b4IzSA==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
prop-types "^15.6.2"
scheduler "^0.12.0"
scheduler "^0.13.3"

read-pkg-up@^1.0.1:
version "1.0.1"
Expand Down Expand Up @@ -7234,14 +7234,6 @@ sax@^1.2.4, sax@~1.2.4:
resolved "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk=

scheduler@^0.12.0:
version "0.12.0"
resolved "http://registry.npm.taobao.org/scheduler/download/scheduler-0.12.0.tgz#8ab17699939c0aedc5a196a657743c496538647b"
integrity sha1-irF2mZOcCu3FoZamV3Q8SWU4ZHs=
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"

scheduler@^0.13.3:
version "0.13.3"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.3.tgz#bed3c5850f62ea9c716a4d781f9daeb9b2a58896"
Expand Down

0 comments on commit fa1e38c

Please sign in to comment.