代码之家  ›  专栏  ›  技术社区  ›  J. Hesters

反应测试库:对于每个测试键,我需要一个新的带有新选择器的测试吗?

  •  0
  • J. Hesters  · 技术社区  · 7 年前

    我正在使用React测试库用TDD构建一个React应用程序。

    TLDR: 选择器(例如) toBeInTheDocument() )似乎只工作一次,之后 render . 对吗?

    我用CRA制作了这个应用程序,这是我的 src/setupTests.js :

    // react-testing-library renders your components to document.body,
    // this will ensure they're removed after each test.
    import "react-testing-library/cleanup-after-each";
    // this adds jest-dom's custom assertions
    import "jest-dom/extend-expect";
    

    以下是我写的测试:

    import { pluck } from "ramda";
    import React from "react";
    import { render } from "react-testing-library";
    import ContactList from "../components/ContactList";
    import { contacts } from "../fixtures";
    
    describe("Contact List", () => {
      describe("given no contacts", () => {
        const { getByText } = render(<ContactList />);
    
        it("displays 'First Name' in the header", () => {
          const actual = getByText(/first name/i);
          expect(actual).toBeInTheDocument();
        });
    
        it("displays 'Last Name' in the header", () => {
          const actual = getByText(/last name/i);
          expect(actual).toBeInTheDocument();
        });
    
        it("displays 'No Contacts'", () => {
          const actual = getByText(/no contacts/i);
          expect(actual).toBeInTheDocument();
        });
      });
    
      describe("given a list of contacts", () => {
        const props = { contacts };
    
        const { getAllByTestId } = render(<ContactList {...props} />);
    
        it("displays the first name of all contacts", () => {
          const actual = pluck("textContent")(getAllByTestId("contact-first-name"));
          const expected = pluck("firstName")(contacts);
          expect(actual).toEqual(expected);
        });
    
        it("displays the last name of all contacts", () => {
          const actual = pluck("textContent")(getAllByTestId("contact-last-name"));
          const expected = pluck("lastName")(contacts);
          expect(actual).toEqual(expected);
        });
      });
    });
    

    下面是我写的组件:

    import React from "react";
    import PropTypes from "prop-types";
    import Table from "@material-ui/core/Table";
    import TableBody from "@material-ui/core/TableBody";
    import TableCell from "@material-ui/core/TableCell";
    import TableHead from "@material-ui/core/TableHead";
    import TableRow from "@material-ui/core/TableRow";
    import withStyles from "@material-ui/core/styles/withStyles";
    import strings from "../strings";
    
    function ContactList({ contacts }) {
      const renderContact = ({ firstName = "N/A", lastName = "N/A", id }) => (
        <TableRow key={id}>
          <TableCell data-testid="contact-first-name">{firstName}</TableCell>
          <TableCell data-testid="contact-last-name">{lastName}</TableCell>
        </TableRow>
      );
      return (
        <Table>
          <TableHead>
            <TableRow>
              <TableCell>{strings.firstName}</TableCell>
              <TableCell>{strings.lastName}</TableCell>
            </TableRow>
          </TableHead>
          <TableBody>
            {contacts.length > 0 ? (
              contacts.map(renderContact)
            ) : (
              <TableRow>
                <TableCell>{strings.noContacts}</TableCell>
              </TableRow>
            )}
          </TableBody>
        </Table>
      );
    }
    
    ContactList.propTypes = {
      classes: PropTypes.object.isRequired,
      contacts: PropTypes.arrayOf(
        PropTypes.shape({
          firstName: PropTypes.string.isRequired,
          lastName: PropTypes.string.isRequired
        })
      ).isRequired
    };
    
    ContactList.defaultProps = {
      contacts: []
    };
    
    const styles = {};
    
    export default withStyles(styles)(ContactList);
    

    现在,如果我运行这些测试,每个测试的前两个通过 describe 块。

    例如,如果我给出 it 测试A .only 它过去了。

    怎么回事?我不能为几个断言重用相同的测试设置吗?我要打电话吗 提供 对于每一个 ?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Gio Polvara    7 年前

    您正在导入 react-testing-library/cleanup-after-each 在每次测试后移除渲染组件。这是正确的方法,但是应该在 it 块。

    推荐文章