Jest SpyOn 返回 undefined

Jest SpyOn returning undefined

提问人:Olivia Bates 提问时间:11/16/2023 最后编辑:Olivia Bates 更新时间:11/16/2023 访问量:31

问:

我正在尝试使用 react-testing-library 和 jest 编写一个 jest 单元测试,而不使用酶,因为根据我所做的研究,react 18 似乎不支持酶。因此,我先发制人地尝试仅使用上述内容编写测试。

我发现的文档和以前的问题表明,可以将 spyOn 方法传递给 Component.prototype(在本例中为 EmailForm.prototype),然后传递您尝试监视的特定方法名称(在本例中为 handleAddEmail)。此方法在我的 EmailForm 组件上定义为常规方法。

链接的问题确实特别提到了渲染应该跟随间谍,以便随后初始化间谍对象,这是我在下面的测试中尝试实现的,但它仍然返回Cannot spyOn on a primitive value; undefined given

我的测试如下:

import { render, fireEvent, screen } from "@testing-library/react";
import EmailForm from "./EmailForm";

const mockSubmit = jest.fn();

const renderComponent = () => {
    return render(<EmailForm actionType="send_email" actionOrigin="Communications" handleActionFormSubmit={mockSubmit} />);
};


describe("EmailForm component", () => {

    it("handles add email with Enter key press", async () => {
        const handleAddEmailSpy = jest.spyOn(EmailForm.prototype, "handleAddEmail");
        renderComponent();
        const recipientField = screen.getByTestId("recipient-field");

        fireEvent.change(recipientField, { target: { value: "[email protected]" } });
        fireEvent.keyDown(recipientField, { key: "Enter" });

        expect(handleAddEmailSpy).toHaveBeenCalled();
    });
});

附加到被监视的 MUI 文本字段的方法如下:

// Function to handle adding new email recipient
  const handleAddEmail = (newEmail: string) => {
    if (!newEmail.trim()) {
      formik.setFieldError("recipient", 
      t("FormValidation.Recipient_Required"));
      return;
    }

    if (!formik.values.recipients.includes(newEmail)) {
      // Add new email recipient
      formik.setFieldValue("recipients", [
        ...formik.values.recipients,
        newEmail
      ]);
      formik.setFieldValue("recipient", "");
    }
  };

我已经为我当前的表单和测试链接了一个代码沙箱。我将不胜感激任何帮助,因为我不确定为什么间谍似乎没有定义。

reactjs 单元 测试 jestjs

评论

1赞 jonrsharpe 11/16/2023
请在问题中放置一个最小的可重复示例 - 像 CodeSandbox 这样的场外链接是严格互补的。
0赞 jonrsharpe 11/17/2023
如果要观察与基于类的组件上的方法的交互,则监视原型将起作用,但不适用于基于函数的组件中的本地定义的函数。这也是不好的做法。测试行为,而不是实现 - 用户应该看到什么结果?

答: 暂无答案