【发布时间】:2022-02-15 11:45:23
【问题描述】:
在以下组件中,当 isHybrid 属性为真时,我将 <HeaderContainer /> 隐藏在 dom 中:
{...}
import { initializeRoutes, lazy } from 'hooks/useRouteHook';
import { isHybridSelector } from 'store/selectors';
import HeaderContainer from './header';
const routes = [
{ component: lazy(...component) },
{...}
];
export const UpgradeBlock = ({ isHybrid }) => {
return (
<Fragment>
{!isHybrid && (
<HeaderContainer />
)}
<div
>
<Suspense fallback={<Loader />}>{initializeRoutes(routes)}</Suspense>
</div>
</Fragment>
);
};
const mapStateToProps = state => ({
isHybrid: isHybridSelector(state),
});
CashUpgradeBlock.propTypes = {
isHybrid: PropTypes.bool,
}
export default connect(mapStateToProps)(UpgradeBlock);
在这里,我想通过模拟 isHybrid 属性值来检查 <HeaderContainer /> 组件的存在。
import React from 'react';
import { Router } from 'react-router-dom';
import { mount } from 'enzyme';
//Internal MockProvider Component.
import { MockProvider } from 'utils/tests';
import HeaderContainer from './header';
import UpgradeBlock from './index';
//Mock router-dom
jest.mock('react-router-dom', () => {
// Require the original module to not be mocked...
const originalModule = jest.requireActual('react-router-dom');
return {
__esModule: true, // Use it when dealing with esModules
...originalModule,
Redirect: jest.fn().mockReturnValue(<div>Redirect</div>),
};
});
//Mock selectors
jest.mock('store/selectors', () => ({
...jest.requireActual('store/selectors'),
isHybridSelector: jest.fn(),
}));
function UpgradeBlockWithStore({ history, ...props } = {}) {
return mount(
<Router {...}>
<MockProvider
{...props}
{...}
>
<UpgradeBlock {...props} />
</MockProvider>
</Router>
);
}
describe('CashUpgradeBlock', () => {
it('renders CashUpgradeBlock', () => {
const wrapper = UpgradeBlockWithStore();
const headerContainer = wrapper.find(HeaderContainer);
isHybridSelector.mockImplementation(() => false);
//Since isHybrid is set to false HeaderContainer should be present in the dom.
expect(headerContainer.exists()).toBe(true); //or .toBeTruthy()
})
})
console.log(wrapper.debug()) 在控制台的结果如下:
console.log organisms/upgrade-block/upgrade-block.spec.js:57
<Router history={{...}}>
<MockProvider resources={{...}}>
<Provider store={{...}}>
<Connect(UpgradeBlock) history={{...}} location={{...}} resources={{...}} />
</Provider>
</MockProvider>
</Router>
即使在互联网上搜索了数小时后,我也找不到任何解决方案……我也不是测试专家;虽然isHybrid在redux中默认设置为false,但我也尝试通过({isHybrid: false})将它提供给UpgradeBlockWithStore(props)仍然没有帮助,测试用例在dom树中找不到headerContainer和期待它是虚假的。
【问题讨论】:
标签: reactjs react-redux jestjs enzyme