OnSelect 检查测试 jest/enzyme
OnSelect check testing jest/enzyme
我有下面这个组件:
import React, {useState} from 'react';
import DropdownButton from 'react-bootstrap/DropdownButton';
import Dropdown from 'react-bootstrap/Dropdown';
const dict = {
'font-family': ['Arial', 'Arial Black', 'Verdana'],
'font-size': ['6', '8', '10', '11', '12', '13', '14', '16', '18', '20'],
}
const DropDown = (props) => {
const [selected, setSelected] = useState(props.value);
const [fontFamilyChoice, setFontFamilyChoice] = useState('font-family-Times-New-Roman');
const handleTextUpdate = (cssClass, cssProperty, cssValue) => {
setSelected(cssValue);
if (cssProperty === 'font-family') {
//removes default or current css font family class stored in the state
$('.' + cssClass).removeClass(fontFamilyChoice);
//value has spaces replaced with - for the new font family class, created in the _functions.scss file
let updateValue = 'font-family-' + cssValue.replace(/ /g, '-');
setFontFamilyChoice(updateValue);
$('.' + props.classToUpdate).addClass(updateValue);
} else if (cssProperty === 'font-size') {
$('.' + cssClass).css({'fontSize': cssValue / 16 + 'em'});
}
}
return (
<div>
<DropdownButton style={{fontFamily: selected}}
className={props.className}
id={props.name}
title={selected}
onSelect={event => handleTextUpdate(props.classToUpdate, props.name, event)}>
{dict[props.name].map((e) => {
return <Dropdown.Item
style={{fontFamily: props.name === 'font-family' ? e : 'Arial'}}
key={e}
eventKey={e}>{e}
</Dropdown.Item>
})}
</DropdownButton>
</div>)
}
export default DropDown;
我希望使用 jest/enzyme 测试此组件,如下所示:
import React from 'react';
import Dropdown from './DropDown';
describe('Test dropdown component', () => {
//name -- either: 'font-family' or 'font-size'
const setupUnitTesting = (name, props = {
value: 'Arial',
classToUpdate: 'test-class',
name: name,
bootstrapGrid: 'col-3',
}) => {
// return shallow(<Dropdown {...props} />);
const div = createDivBody('test-class', 'testing-please');
document.body.appendChild(div);
return mount(<Dropdown {...props} />, {attachTo: document.getElementById('container')});
}
describe('Unit testing font-family', () => {
let wrapper;
beforeEach(() => {
wrapper = setupUnitTesting('font-family');
});
afterEach(() => {
wrapper = null;
});
it('should render correctly', () => {
expectSnapshot(wrapper);
});
// my issue is with this test here
it('should select a dropdown option', () => {
wrapper.find('#font-family').at(0).prop('onSelect')('test-class', 'font-family', 'Arial')
expect(document.getElementById('testing-please').classList.contains('font-family-Arial')).toBeTruthy();
});
});
describe('Unit testing font-size', () => {
let wrapper;
beforeEach(() => {
wrapper = setupUnitTesting('font-size');
});
afterEach(() => {
wrapper = null;
});
it('should render correctly', () => {
expectSnapshot(wrapper);
});
});
});
我不确定我应该如何 'spying' onSelect 按钮。我要求代码覆盖率至少为 80% 或更高,这涉及确保函数 handTextUpdate(...)
被正确调用。
似乎会引起问题,它警告我这不是一个行为(...),但当我这样做时,它仍然抱怨同样的问题。
任何建议,或者如果有人可以编写一个简单的测试示例,这会很棒吗?
感谢您的帮助。
雅各
我得出的答案如下:
it('should select a dropdown option', () => {
act(() => {
wrapper.find('#font-family').at(0).prop('onSelect')('Arial', 'font-family');
expect(document.getElementById('testing-please').classList.contains('font-family-Arial')).toBeTruthy();
});
});
我有下面这个组件:
import React, {useState} from 'react';
import DropdownButton from 'react-bootstrap/DropdownButton';
import Dropdown from 'react-bootstrap/Dropdown';
const dict = {
'font-family': ['Arial', 'Arial Black', 'Verdana'],
'font-size': ['6', '8', '10', '11', '12', '13', '14', '16', '18', '20'],
}
const DropDown = (props) => {
const [selected, setSelected] = useState(props.value);
const [fontFamilyChoice, setFontFamilyChoice] = useState('font-family-Times-New-Roman');
const handleTextUpdate = (cssClass, cssProperty, cssValue) => {
setSelected(cssValue);
if (cssProperty === 'font-family') {
//removes default or current css font family class stored in the state
$('.' + cssClass).removeClass(fontFamilyChoice);
//value has spaces replaced with - for the new font family class, created in the _functions.scss file
let updateValue = 'font-family-' + cssValue.replace(/ /g, '-');
setFontFamilyChoice(updateValue);
$('.' + props.classToUpdate).addClass(updateValue);
} else if (cssProperty === 'font-size') {
$('.' + cssClass).css({'fontSize': cssValue / 16 + 'em'});
}
}
return (
<div>
<DropdownButton style={{fontFamily: selected}}
className={props.className}
id={props.name}
title={selected}
onSelect={event => handleTextUpdate(props.classToUpdate, props.name, event)}>
{dict[props.name].map((e) => {
return <Dropdown.Item
style={{fontFamily: props.name === 'font-family' ? e : 'Arial'}}
key={e}
eventKey={e}>{e}
</Dropdown.Item>
})}
</DropdownButton>
</div>)
}
export default DropDown;
我希望使用 jest/enzyme 测试此组件,如下所示:
import React from 'react';
import Dropdown from './DropDown';
describe('Test dropdown component', () => {
//name -- either: 'font-family' or 'font-size'
const setupUnitTesting = (name, props = {
value: 'Arial',
classToUpdate: 'test-class',
name: name,
bootstrapGrid: 'col-3',
}) => {
// return shallow(<Dropdown {...props} />);
const div = createDivBody('test-class', 'testing-please');
document.body.appendChild(div);
return mount(<Dropdown {...props} />, {attachTo: document.getElementById('container')});
}
describe('Unit testing font-family', () => {
let wrapper;
beforeEach(() => {
wrapper = setupUnitTesting('font-family');
});
afterEach(() => {
wrapper = null;
});
it('should render correctly', () => {
expectSnapshot(wrapper);
});
// my issue is with this test here
it('should select a dropdown option', () => {
wrapper.find('#font-family').at(0).prop('onSelect')('test-class', 'font-family', 'Arial')
expect(document.getElementById('testing-please').classList.contains('font-family-Arial')).toBeTruthy();
});
});
describe('Unit testing font-size', () => {
let wrapper;
beforeEach(() => {
wrapper = setupUnitTesting('font-size');
});
afterEach(() => {
wrapper = null;
});
it('should render correctly', () => {
expectSnapshot(wrapper);
});
});
});
我不确定我应该如何 'spying' onSelect 按钮。我要求代码覆盖率至少为 80% 或更高,这涉及确保函数 handTextUpdate(...)
被正确调用。
似乎会引起问题,它警告我这不是一个行为(...),但当我这样做时,它仍然抱怨同样的问题。
任何建议,或者如果有人可以编写一个简单的测试示例,这会很棒吗?
感谢您的帮助。
雅各
我得出的答案如下:
it('should select a dropdown option', () => {
act(() => {
wrapper.find('#font-family').at(0).prop('onSelect')('Arial', 'font-family');
expect(document.getElementById('testing-please').classList.contains('font-family-Arial')).toBeTruthy();
});
});