【发布时间】:2018-09-15 06:17:46
【问题描述】:
我是一个开玩笑的新手,我正在为我的 react 应用程序编写单元测试,该应用程序使用 redux 并使用 Typescript 编写。
我的容器组件包含这段代码:
const mapDispatchToProps = (dispatch: Dispatch<any>) => ({
onSelectScenario: (selectedScenario: any) => {
dispatch(selectScenario(selectedScenario));
}
});
我想编写一个单元测试,检查当我从测试 (onSelectScenario) 调用这个道具时,dispatch 方法将被调用正确的参数。
知道如何监视这个dispatch吗?
这是我调用 prop 方法的单元测试:
it('should dispatch', () => {
component.props().onSelectScenario('New Selected Scenario');
});
这是我定义提供模拟存储的容器组件的测试设置:
const mockStore = configureMockStore();
let store = mockStore({
scenarios: ['Scenario 1', 'Scenario 2']
});
let component: ShallowWrapper<any, any>;
describe('ScenarioListGroupContainer Component', () => {
beforeEach(() => {
component = shallow(<ScenarioListGroupContainer store={store} />);
});
// ...
});
【问题讨论】:
-
仅供参考,您正在测试
mapDispatchToProps是否按预期工作。然而,这是 redux 的一部分,你应该相信库本身已经测试了它的功能。就调用 props 而言,通常只测试实际组件。它们很容易被窥探到,而且大多数时候浅渲染也足够了。 -
不,我正在测试我通过 redux 与 props 匹配的方法中的逻辑是否按预期工作。我只想看到调用那个道具,通过redux添加,有一个调用dispatch传递正确的参数
-
很公平。请记住,您也可以为
mapDispatchToProps传递一个简单的对象。它自动绑定要调度的每个动作,并且该对象基本上只是成为一个动作列表:const mapDispatchToProps = { selectScenario, otherAction, etc. };然后组件将调用this.props.selectScenario。这样就没有什么可以测试的了。如果在调用单个道具时需要发生多个调度或其他副作用,您真的只需要声明mapDispatchToProps的“长”方式。 -
@quirimmo 您回滚了更新以添加用于代码格式化的语言标签,这使得这个问题更具可读性。我认为这是合适的,是否有理由不允许对这个问题进行代码格式化?
标签: reactjs redux react-redux jestjs react-tsx