Jest.js TypeError:无法解构“React__namespace.useContext(...)”的属性“basename”,因为它为null

igetnqfo  于 2023-04-27  发布在  Jest
关注(0)|答案(2)|浏览(628)

我用Jest执行React测试,在测试运行后,它在render(<Carrinho ItensCarrinho={ itensCarrinho } incrementeCarrinho={ incrementeCarrinhoMock } decrementeCarrinho={ decrementeCarrinhoMock }/>);行返回错误TypeError: Cannot destructure property 'basename' of 'React__namespace.useContext(...)' as it is null.
我已经看到了帖子Uncaught TypeError: Cannot destructure property 'basename' of 'React2.useContext(...)' as it is null,它并没有解决我的问题。
Carrinho.test.js:

  1. import React from "react";
  2. import { render, screen } from "@testing-library/react";
  3. import "@testing-library/jest-dom";
  4. import userEvent from "@testing-library/user-event";
  5. import Carrinho from '../components/Carrinho.js';
  6. describe("Carrinho component", () => {
  7. const itensCarrinho = [{
  8. id: "1",
  9. nome: "Fone de ouvido",
  10. preco: 100,
  11. promo: 0,
  12. src: "nome.jpg",
  13. detalhes: "detalhes",
  14. quantidade: 1,
  15. }];
  16. const incrementeCarrinhoMock = jest.fn();
  17. const decrementeCarrinhoMock = jest.fn();
  18. it("renders correct heading", () => {
  19. render(<Carrinho ItensCarrinho={ itensCarrinho } incrementeCarrinho={ incrementeCarrinhoMock } decrementeCarrinho={ decrementeCarrinhoMock }/>);
  20. expect(screen.getByRole("heading").textContent).toMatch(/Total:/i);
  21. });
  22. });

Carrinho.js:

  1. import '../styles/carrinho.css';
  2. import { Link } from "react-router-dom";
  3. function Carrinho( { ItensCarrinho, incrementeCarrinho, decrementeCarrinho }){
  4. var total=0;
  5. ItensCarrinho.map((item) => {
  6. if(item.promo !== 0){
  7. total = total + item.quantidade*item.promo;
  8. }else{
  9. total = total + item.quantidade*item.preco;
  10. }
  11. })
  12. console.log(ItensCarrinho);
  13. return (
  14. <div id="produtoCarrinho">
  15. <div id="fundoCarrinho">
  16. <h1>Carrinho</h1>
  17. {ItensCarrinho.map((item) => (
  18. <div id="itenCarrinho">
  19. <img src={ item.src } alt={ item.nome }></img>
  20. <div id="detalhes">
  21. <h3>{ item.nome }</h3>
  22. <p>{ item.detalhes }</p>
  23. <p>{ (item.promo !=="0") ? "De R$ " + item.preco + ",00 por R$ " + item.promo+",00" : "R$ "+item.preco+",00" }</p>
  24. <div id="btnIncrementar">
  25. <button onClick={ () => { decrementeCarrinho(item.id) } }> - </button>
  26. <p> { item.quantidade } </p>
  27. <button onClick={ () => { incrementeCarrinho(item.id) } }> + </button>
  28. </div>
  29. </div>
  30. </div>
  31. ))}
  32. <h2>Total: R${ total },00</h2>
  33. <div id="btnCompre">
  34. <Link to="/products/"><button>Continue comprando</button></Link>
  35. </div>
  36. </div>
  37. </div>
  38. );
  39. }
  40. export default Carrinho;
0vvn1miw

0vvn1miw1#

问题出在Link的使用上。该组件需要出现在路由器内部,但在您的测试中却没有。
您可以尝试使用react-router-dom中的MemoryRouter(* 这是最轻的一个 *) Package 组件来克服这个问题。

  1. render(<MemoryRouter><Carrinho ... /></MemoryRouter>);
hyrbngr7

hyrbngr72#

我认为它是Carriho组件中使用的prop名称。在测试中,您将ItensCarriho作为prop传递,但在组件中,您使用ItensCarriho而不是ItensCarriho(小写“i”)进行解构。使ItensCarriho为null?,导致错误。
将传递到测试文件中的prop名称更改为itensCarrinho(小写“i”),如下所示:

  1. render(<Carrinho itensCarrinho={ itensCarrinho } incrementeCarrinho={ incrementeCarrinhoMock } decrementeCarrinho={ decrementeCarrinhoMock }/>);

此外,在Carriho组件中,确保使用itensCarriho(小写字母“i”)进行解构,如下所示:

  1. function Carrinho( { itensCarrinho, incrementeCarrinho, decrementeCarrinho }){

这可以解决它吗?在你的测试文件中,你用大写的“I”将prop ItensCarrinho传递给你的Carrinho组件,但是在你的Carrinho组件中,你用小写的“i”解构prop。这导致ItensCarrinho prop在Carrinho组件中未定义,导致你看到的错误。
要解决此问题,您可以更改Carriho组件中的 prop 名称,以匹配测试文件中 prop 的大写。

相关问题