3

使用HOC测试组件通常似乎是一个主要问题(酶#539酶#1002重组#407,...)。大多数讨论包括“仅测试 HOC 作为函数,然后不测试用法”的观点,因此对于单元测试,实际组件以命名导出的形式导出并单独测试。然后建议一些解决方法(比如dive直到到达组件等)。

因此,技术实现对我来说也(相对)清楚,但我现在很难以及最终应该如何以及是否应该使用 HOC 测试该组合物。

例子:

import withState from 'recompose/withState';

export const InnerMyComponent = /* ... */;

const enhance = withState('prop', 'setProp', null);

export const MyComponent = enhance(InnerMyComponent);

对于应用程序来说,正确调用 withState 并将其prop传递setProp给内部组件似乎非常重要。我是否应该始终相应地测试这两个道具是否正确传递,例如

expect(shallow(<MyComponent />).dive().prop('setProp')).toBeDefined()

那么,我应该编写这样的测试还是测试应用程序组合的更好方法?

4

2 回答 2

2

测试或不测试 HOC 可能取决于您使用的是哪个 HOC(无论是您编写的 HOC 还是从库中导入的 HOC)。如果它是从库中导入的 HOC,则库有责任为该 HOC 编写测试用例,因为它是向您公开方法和道具的人,因此应该可以正常工作。另一方面,如果你已经编写了一个 HOC,你应该编写测试用例来验证它在不同场景下是否正确运行。

为了测试用 HOC 包裹的组件,最简单的方法是通过向组件提供道具来测试它,当您像浅安装它时 HOC 将提供该组件

const wrapper = shallow(<InnerMyComponent prop={null} setProps={jest.fn()} />);

然后测试 InnerMyComponent 的行为

现在,当您必须测试自定义 HOC 时,您可以将其作为一个函数进行测试,将一些随机组件传递给它并检查该组件是否接收到这些道具并测试内部函数

于 2018-06-19T06:50:41.377 回答
0

在对 HOC 进行单元测试时,应该测试三个主要内容(如果 HOC 的某些部分非常简单,则这些测试可能并非全部都是必需的)。下面的示例使用 Jest。

1)道具应该正确地传递给内部组件。这包括 HOC 创建或修改的,以及直接通过的。例如:

    it("passes A prop to InnerMyComponent", async () => {
        // ...
        let container = shallow(<MyComponent {...props}/>).dive();
        const inner = container.find(InnerMyComponent).at(0);
        const { A } = inner.props();
        expect(inner.props().A).toEqual(expectedA);
    });

2) HOC 中的生命周期方法按预期工作。例如:

    it("calls X on mount", async () => {
        // ...
        spy = jest.spyOn(MyComponent.WrappedComponent.prototype, "X");
        const component = mount(
            <MyComponent {...props}/>
        );
        expect(spy).toHaveBeenCalled();
        spy.mockReset();
    });

3) HOC 中的非生命周期方法按预期工作。

    it("method P works", () => {
        // ...
        let container = shallow(<MyComponent {...props}/>).dive();
        let result = container.instance().P("input");
        expect(result).toEqual(expectedResult);
    });

任何进一步的功能都将与内部组件相关,因此应该在那里进行测试,或者在集成测试领域。由于 HOC 充当普通组件,因此它们应该能够在集成测试中被这样对待。

于 2018-06-19T10:06:56.380 回答