javascript - 开玩笑测试反应上下文
问题描述
我是测试新手,一段时间以来一直在尝试解决这个问题。虽然我可以找到类似的帖子,但我没有找到任何对我有用的东西。我认为这个问题可能是因为我的 AppContext 的设置与其他人有点不同。
我有一个看起来像这样的 AppContext:
const AppContext = React.createContext();
export class AppContextProvider extends Component {
constructor(props) {
super(props);
this.state = {
predefinedRoles: [
{role_type : "2nd Project Manager", profile: {user: {first_name : '', last_name: ''}}},
{role_type : "Executive Sponsor", profile: {user: {first_name : '', last_name: ''}}},
{role_type : "CFO or Finance Contact", profile: {user: {first_name : '', last_name: ''}}},
{role_type : "OI & T Contact", profile: {user: {first_name : '', last_name: ''}}},
{role_type : "Payroll Contact", profile: {user: {first_name : '', last_name: ''}}},
{role_type : "Human Resources Contact", profile: {user: {first_name : '', last_name: ''}}}
],
};
}
render() {
return (
<AppContext.Provider
value={{
predefinedRoles: this.predefinedRoles,
}}
>
{this.props.children}
</AppContext.Provider>
);
}
}
export const withContext = Component => {
return function AppContextComponent(props) {
return (
<AppContext.Consumer>
{globalState => <Component {...globalState} {...props} />}
</AppContext.Consumer>
);
};
};
我想要做的是测试这些 Context 值是否被正确映射到另一个组件中。
这是我的映射组件:
export const AssignRoles = props => {
const predefinedRoles = props
return (
<div className={styles.rolesPage} id="assign-roles-roles-page">
{predefinedRoles.map((roles, id)=> {
return(<AssignRolesCard organizationRoles={roles} key={id} handleFormOpen={handleFormOpen} updateCreateOrEdit={updateCreateOrEdit}/>)
})}
</div>
)
}
export default withContext(AssignRoles);
我一直在尝试编写一个测试来检查 AssignRoles 是否正在呈现,但我得到一个失败,说“无法读取未定义的属性映射”。
我已经尝试了以下代码的几种不同组合,<AppContext>
<AppContext.Provider>
<AppContext.Consumer>
但我仍然无法让我的测试成功通过。
let predefinedRoles = [
{name : "2nd Project Manager", assigned : false},
{name : "Executive Sponser", assigned: false},
{name : "CFO or Finance Contact", assigned: false},
{name : "OI&T Contact", assigned: false},
{name : "Payroll Contact", assigned: false},
{name : "HR Contact", assigned: false}
]
it('renders without crashing', () => {
const div = document.createElement('div');
ReactDOM.render(<AppContext value={predefinedRoles}><AssignRoles /></AppContext>, div);
});
我一直在这里查看 React 测试库文档,并尝试了我能想到的一切来匹配他们所做的事情,但我仍然没有成功。
解决方案
这应该是直截了当的,无论是酶还是反应测试库。将您的测试组件包装在提供程序组件下。
const componentUnderTest = <AppContextProvider {..allPropsYouNeed}>
<Foo />
</AppContextProvider>
使用 react-testing-library,您可以测试所需的操作或元素是否使用您需要的传递的上下文值进行渲染(例如颜色是否改变或渲染不同等)。
使用酶(安装),您可以观察到相同的情况。但是如果你想手动检查组件的 props,你不能(因为酶只允许检查根组件的 props 而不是子组件),你不应该。毕竟测试是关于你的组件应该如何表现而不是它需要什么。(react-testing-library原理)
推荐阅读
- amazon-cloudwatch - Vault 遥测到 CloudWatch
- html - 尝试在 HTML 中完成圣杯,尝试在侧栏中制作 ul 但列表正在转到主要内容
- python - 你如何有效地随机抽样 k 个大小为 r 的组合形成一个列表?
- reactjs - React Child Props 没有被传递
- postgresql - 是否可以为 postgresql 视图创建行级安全策略?
- c# - 尝试一次性从 Web api 中的控制器内的所有方法返回值
- angular - Angular 8 Radio 真假
- java - 从并发的角度来看,这段用于确定性执行 Java 线程的代码是否正确?
- matlab - 在 Matlab 中截断单个表格单元格
- r - 计算多个数据同时性的 ICC