【问题标题】:react js jest unit testingreact js jest 单元测试
【发布时间】:2022-01-06 19:29:00
【问题描述】:

Login 函数组件中,我有一个函数validateForm,它检查usernamepassword 的长度是否大于零。

function validateForm() {
  return username.length > 0 && password.length > 0;
}

我使用 Jest 作为单元测试工具。

import React from "react";
import Login, { validateForm } from "./Login";
import { render, screen } from "@testing-library/react";

describe("LoginUser", () => {
  test("validate username and password should be greater than 0", () => {
    var username = "name";
    var password = "pass";
    expect(validateForm(username.length)).toBeGreaterThan(0);
  });
});
TypeError: (0 , _Login.validateForm) is not a function

我在运行测试用例时遇到了上述错误。如何解决这个错误?

【问题讨论】:

    标签: reactjs react-hooks jestjs ts-jest


    【解决方案1】:

    您好像忘记导出了:

      ...
      export function validateForm() {
        return username.length > 0 && password.length > 0;
      }
      ...
    

    但是如果validateForm被定义在在Login组件(函数)的主体内,考虑将它移出并单独导出以使这个测试工作。

      // Put outside and export:
      export function validateForm(username, password) {
        return username.length > 0 && password.length > 0;
      }
    
      const Login = (props) => {
        // And remove from here.
        // function validateForm() {
        //    return username.length > 0 && password.length > 0;
        // }
    
        // use this variable in the component.
        const isFormValid = validateForm(username, password);
    
        return ...
      }
    
      export default Login;
    

    【讨论】:

    • 登录功能是主要功能,而 validateForm 是子功能
    • 如果我使用导出功能验证获取语法错误
    • 在这种情况下,您似乎需要遵循第二个选项并将其移到外面。顺便说一句,你能分享一下那个组件的全部代码吗?
    • @bindushree 我不会把它移出 - 测试 behaviour (大概这个布尔值用于决定某些事情,例如是否应该启用提交按钮,所以在该决定的结果)而不是实施
    • 更新了第二个例子,以更好地反映我所说的“搬出”的意思。