【问题标题】:Testing redux connected component测试 redux 连接组件
【发布时间】:2018-05-02 09:51:23
【问题描述】:

我在 React-Redux 中有以下连接组件

export class IncrementalSearch extends React.Component {

    constructor(props) {
        super(props);
        this.onSearch$ = new Subject();
        this.onChange = this.onChange.bind(this);
    }

    componentDidMount() {
        this.subscription = this.onSearch$
            .debounceTime(300)
            .subscribe(debounced => {
                this.props.onPerformIncrementalSearch(debounced);
            });
    }

    componentWillUnmount() {
        if (this.subscription) {
            this.subscription.unsubscribe();
        }
    }

    onChange(e) {
        const newText = e.target.value;
        this.onSearch$.next(newText);
    }

    render() {
        return (
            <div className={styles.srchBoxContaner}>
                <input
                    className={styles.incSrchTextBox}
                    type="text" name="search" id="searchInput" placeholder="Search.."
                    onChange={this.onChange}
                />
            </div>
        );
    }
}

const mapDispatchToProps = (dispatch) => ({
    onPerformIncrementalSearch: (searchText) => {
        dispatch(performIncrementalStoreSearch(searchText));
    }
});

const IncrementalSearchComponent = connect(null, mapDispatchToProps)(IncrementalSearch);
export default IncrementalSearchComponent;

我现在正在尝试为连接的组件编写单元测试。我正在使用 Jest、Enzyme 和 Sinon。到目前为止,这就是我的单元测试的样子

it('calls \'onPerformIncrementalSearch\' when the user types in something', () => {
    const mockStore = configureStore();

    const onPerformIncrementalSearchSpy = sinon.spy();
    const mapStateToProps = null;
    const mapDispatchToProps = {
        onPerformIncrementalSearch: onPerformIncrementalSearchSpy
    };

    const mappedProps = { mapStateToProps, mapDispatchToProps };

    const incrementalSearchWrapper =
        mount(
            <Provider store={mockStore}>
                <IncrementalSearchComponent
                    onPerformIncrementalSearch={onPerformIncrementalSearchSpy}
                    props={mappedProps}
                    store={mockStore}
                />
            </Provider>
        );


    //find the input element
    const searchInput = incrementalSearchWrapper.find('#searchInput');
    searchInput.node.value = 'David';
    searchInput.simulate('change', searchInput);
    expect(onPerformIncrementalSearchSpy.called).toEqual(true);
    // onChangeSpy.restore();
});

但是,当我运行此测试时,出现以下错误

TypeError: 无法读取未定义的属性“绑定”

我该如何解决这个问题?

【问题讨论】:

    标签: unit-testing redux sinon enzyme jestjs


    【解决方案1】:

    测试连接的组件可能是一个巨大的痛苦。我发现尝试用Provider 包装您的组件以使它们能够访问商店,这比它的价值更麻烦。

    相反,我只导出组件mapStateToPropsmapDispatchToProps 并单独测试它们。如果您将连接的组件导出为默认组件,您的应用仍然可以正常工作。

    Dan Abramov(Redux 的共同作者)在 this comment 中提出了这种方法

    我还建议在测试连接的组件时查看enzyme shallow rendering 而不是使用mount

    【讨论】:

    • 但是连接的组件不仅仅是mapStateToprops和mapDispatchToProps,组件中还有其他逻辑需要我测试。那么我该如何测试呢?
    • 您仍然可以通过这种方式测试组件中的逻辑。你只会有两个exports。一种是导出连接的组件export default connect ...,然后您可以通过import { default as myComponent } 在您的应用程序中导入它。您还可以导出未连接的组件,如export class myComponent,并在您的测试中导入,如import { myComponent }。然后你可以测试组件中的所有逻辑,而不必担心访问存储和测试连接的组件。
    • This answer 可能有助于进一步解释。
    • 也许我不明白,我已经导出了连接和未连接的组件,当我只是尝试挂载或浅化连接的组件来测试其逻辑时,问题就出现了。有没有我可以使用的工作示例?
    • bill 的要点是您不需要测试 connect 函数,因为那不是您的代码。您的代码都在未连接的组件和mapState/DispatchToProps 中。如果你测试了这些,那么你已经测试了你所有的逻辑。
    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2017-11-26
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2020-03-30
    相关资源
    最近更新 更多