【问题标题】:Testing Style on React component在 React 组件上测试样式
【发布时间】:2020-08-10 10:46:12
【问题描述】:

我有一个带有函数的类,它在一个单独的文件中打开一个模态 (open_modal(...)) 到一个组件,因为我有大量使用此功能的模态。

import open from "open";
import $    from "jquery";

class ReactHelpers {

    static open_webpage(page_url) {
        open(page_url);
    }

    static open_modal(overlay_id, modal_id) {
        $(overlay_id).css("display", "block");
        $(modal_id).css("display", "block");
    }

    static close_modal(overlay_id, modal_id) {
        $(overlay_id).css("display", "none");
        $(modal_id).css("display", "none");
    }
}

export default ReactHelpers;



我试图断言 open_modal 函数已将 css 添加到有问题的 div 中,如下所示:

    it('should close the modal', function () {
        const wrapper = shallow(
            <div id="overlay_id">
                <div id="modal_id">
                    <p>modal</p>
                </div>
            </div>
        )
        const overlay = wrapper.find('#overlay_id')
        const modal = wrapper.find('#modal_id')
        ReactHelpers.open_modal(overlay, modal);
        console.log('OVERLAY ', overlay);
        expect(overlay.prop('style')).toHaveProperty('display', 'block');
        expect(modal_style).toHaveProperty('display', 'block');
    });

此外,我确定如何测试 open_webpage 函数,因为这是一个库函数。在我对其他组件的其他测试中,我对此进行了嘲笑,因此它从未真正经过测试。

非常感谢任何帮助。

谢谢

【问题讨论】:

    标签: css reactjs unit-testing testing


    【解决方案1】:

    测试 dom 元素的样式:

    1. 您应该挂载组件(使用mount),而不是仅仅创建它(使用shallow)。

    2. 由于您是直接更改 dom 元素的样式,因此您应该测试 dom 元素的样式 (component.getDOMNode().style.display),而不是测试 react 样式属性 (component.prop.style)。

    示例:

    import $ from "jquery";
    it("should create a div and changes its color to red", () => {
      const wrap = mount(
          <div id="red_el"></div>
      );
      const el = wrap.find("#red_el").getDOMNode()
      $(el).css("color", "red");
      expect(el.style.color).toEqual("red");
    });
    

    在你的情况下:

    it("should open modal", () => {
      const wrapper = mount(
        <div>
          <div id="overlay" style={{ display: "none" }}>
            <div id="modal" style={{ display: "none" }}>
              overlay
            </div>
          </div>
        </div>
      );
      const overlay = wrapper.find("#overlay").getDOMNode();
      const modal = wrapper.find("#modal").getDOMNode();
      ReactHelpers.open_modal(overlay, modal);
      expect(overlay.style.display).toEqual("block");
      expect(modal.style.display).toEqual("block");
    });
    

    See it live on codesandbox(切换到测试选项卡以运行测试。)

    【讨论】:

    • 嗨,亚亚,非常感谢您的回复。这对我有用!我知道我哪里出错了,我会从错误中吸取教训:)。我想你不知道我可以对 open_webpage 采取什么样的方法?是不是只为open做一个模拟函数@
    • @OrangeSubmarine121 没问题。实际上,最好在单独的问题中提出两个单独的问题,所以请把它放在另一个问题上。但要回答它:如果它是一个简单的库函数,例如:add,你可以调用它并检查它当前是否有效。但是由于它打开了一个网页,因此很难对其进行测试。而且我认为模拟也不起作用,因为它只执行一项简单的任务(打开网页),如果你模拟它,你实际上无法测试它。所以在我看来,测试在这种情况下没有意义,除非您可以检查是否正在调用 window.open 或 ...
    • 太棒了,不用担心,将它们作为两个单独的问题来问是有意义的。感谢您的建议!
    猜你喜欢
    • 2020-09-29
    • 2019-01-17
    • 1970-01-01
    • 2021-08-06
    • 2017-04-09
    • 2021-10-24
    • 2021-11-25
    • 1970-01-01
    • 2020-02-27
    相关资源
    最近更新 更多