JEST组件测试
JEST组件测试
我刚开始使用Jest进行单元测试。我正在测试一个React应用程序中的组件。有两个组件:Home
和LogOutButton
。
这是Home
组件的代码:
import 'bootstrap/dist/css/bootstrap.css'; import 'bootstrap/dist/css/bootstrap-theme.css'; import React from 'react'; import ReactDOM from 'react-dom'; import { LogOutButton } from './LogOutButton.js'; class Home extends React.Component { displayName = Home.name; state = { result: 0, val1: 0, val2: 0, }; handleChangeOne = event => { this.setState({ val1: event.target.value }); }; handleChangeTwo = event => { this.setState({ val2: event.target.value }); }; add = () => { this.setState({ result: parseInt(this.state.val1) + parseInt(this.state.val2) }); }; onLogoutClick = () => { window.location.href = 'https://www.MICROSOFT.com'; } render() { return (Hello world! The result is: {this.state.result}
+ =); } } export default Home; const rootElement = document.getElementById("root"); ReactDOM.render( , rootElement);
Home
组件可以获取两个数字并渲染它们的和。它还导入了LogOutButton
组件,当点击它时,应将您重定向到Microsoft网站。
我想测试用户点击LogOut
的情况。
这是我的建议:
describe('Home />', () => { it('点击LogOut后将重定向到Microsoft网站', () => { const homeWrapper = shallow(); homeWrapper.find('LogOutButton').simulate('click'); homeWrapper.update(); expect(homeWrapper.html).toEqual('https://www.MICROSOFT.com'); }); }
但是这并不起作用...
我希望能得到写正确的测试方法的帮助。
提前感谢。
在进行组件测试时,出现了一些问题。首先,测试中模拟了一个'ckick'事件,而不是一个'click'事件,这可能是笔误导致的。其次,.html是一个函数,所以在测试中应该在它后面加上括号。另外,在调用homeWrapper.update()时似乎多余了。最后,最重要的是,即使组件按预期工作,点击LogOutButton的结果将是页面重定向到https://www.MICROSOFT.com。即使重定向成功 - 我认为不会成功,因为测试不是在真实的浏览器中运行 - 也没有理由期望调用homeWrapper.html()会返回URL,它将返回组件的渲染HTML。在你的情况下,你可以期望调用homeWrapper.html()返回类似于下面的内容:
Hello world! The result is: 0
+=
当然,这并不能证明onLogoutClick是否正常工作。相反,你可能考虑在测试中用Jest Mock替换onLogoutClick,并期望该mock函数被调用一次。
Jest组件测试问题的出现原因是在测试中试图修改无法修改的window.location
。解决方法是将其删除,并创建一个可修改的window.location
对象。以下是解决问题的代码示例:
delete window.location; window.location = { reload: jest.fn() }; describe('Home', () => { it('should click logout button', () => { const component = Enzyme.mount(); const logOutButton = component.find(LogOutButton); logOutButton.simulate('click'); expect(window.location.href).toEqual('https://www.MICROSOFT.com'); }); });
通过删除window.location
对象,并使用一个含有reload
方法的对象来代替,我们成功解决了Jest组件测试中无法修改window.location
的问题。这样,在测试中模拟点击登出按钮后,我们可以断言期望的window.location.href
是否等于'https://www.MICROSOFT.com'。