使用Error()而不在Jest中引发异常

时间:2020-01-30 19:36:06

标签: reactjs jestjs enzyme

我有一个名为<Error />的React组件,它可以接受字符串或实际的Error()对象。

下面的Jest / Enzyme代码有效:

it('renders with error prop', () => {
  const component = shallow(<Error error="Foobar" />);
  expect(component.text()).toMatchSnapshot();
  expect(component.text()).toEqual('Foobar');
});

但是以下内容却没有:

it('renders with new Error() error prop', () => {
  const error = new Error('Foobar');
  const component = shallow(<Error error={error} />);
  expect(component.text()).toMatchSnapshot();
  expect(component.text()).toEqual('Foobar');
});

new Error()行导致RangeError: Maximum call stack size exceeded

我试图将其包装在try {} catch () {}中,但它只会吞没所有东西。

我尝试以expect(() => { ... })的身份进行操作,但是我无法让它运行断言-看来,这只有在您想将其通过管道传输到.toThrow()

时才有效

以下内容乍看起来很有希望,但实际上并没有将任何内容发送到catch中的error参数:

it('renders with new Error() error prop', () => {
  try {
    new Error('Foobar');
  }
  catch (error) {
    const component = shallow(<Error error={error} />);
    expect(component.text()).toMatchSnapshot();
    expect(component.text()).toEqual('Foobar');
  }
});

有什么想法吗?预先感谢。

1 个答案:

答案 0 :(得分:1)

在测试文件中尝试一下:

class Child {
public:
    Child() { py::print("Allocating child."); }
    Child(const Child &) = default;
    Child(Child &&) = default;
    ~Child() { py::print("Releasing child."); }
};
py::class_<Child>(m, "Child")
    .def(py::init<>());

class Parent {
public:
    Parent() { py::print("Allocating parent."); }
    ~Parent() { py::print("Releasing parent."); }
    void addChild(Child *) { }
    Child *returnChild() { return new Child(); }
    Child *returnNullChild() { return nullptr; }
};
py::class_<Parent>(m, "Parent")
    .def(py::init<>())
    .def(py::init([](Child *) { return new Parent(); }), py::keep_alive<1, 2>())
    .def("addChild", &Parent::addChild)
    .def("addChildKeepAlive", &Parent::addChild, py::keep_alive<1, 2>())
    .def("returnChild", &Parent::returnChild)
    .def("returnChildKeepAlive", &Parent::returnChild, py::keep_alive<1, 0>())
    .def("returnNullChildKeepAliveChild", &Parent::returnNullChild, py::keep_alive<1, 0>())
    .def("returnNullChildKeepAliveParent", &Parent::returnNullChild, py::keep_alive<0, 1>());

您也可以尝试使用其他名称来命名错误组件。

希望这会有所帮助。