当前位置: 首页 > 知识库问答 >
问题:

在一个测试文件中工作,但在另一个测试文件中失败

郎诚
2023-03-14
/api
  index.js
  base.js
  notebooks.js
/components
  AllNotebooks/
  NewNotebook/
/containers
  AllNotebooks/
  NewNotebook/
  common/withList/

我在用开玩笑。间谍。模拟实现模拟我的笔记本。jsapi,这是为

// api/base.js
const instance = axios.createinstance({url: BASE_URL})

export default instance

// api/notebooks.js
const getAll = () => instance.get("/notebooks");
const create = id => instance.post("/notebooks")

export {getAll, create}

// api/index.js
import * as notebooksApi from './notebooks'
export {notebooksApi}

现在,它与

import NewNotebook from "../../components/NewNotebook";
import { notebooksApi } from "../../api/index";

const NewNotebookContainer = function () {
  const handleSubmit = () => {
    if (!newNotebook.title.length) {
      return false;
    } else {
      return notebooksApi.create(newNotebook).then(() => {
        toggleModal();
      });
    }
  };
  return (
    <NewNotebook handleSubmit={handleSubmit}/>
  );
};

export default NewNotebookContainer;


// ./__test__/index.js

it("should invoke api if title exists", async () => {
    renderNotebook();
    const spy = jest
      .spyOn(notebooksApi, "create")
      .mockImplementation((x) => Promise.resolve(x));
    await act(() => {
      fireEvent.click(screen.getByRole("button", { name: /Create Notebook/ }));
      return Promise.resolve();
    });
    expect(spy).toHaveBeenCalledTimes(1);
  });

但是,笔记本Api不会被嘲笑。

// AllNotebooksContainer/index.js

import AllNotebooks from "../../components/AllNotebooks";
import { notebooksApi } from "../../api/index";
import withList from "../common/withList";

const AllNotebooksContainer = withList(AllNotebooks, notebooksApi.getAll);

export default AllNotebooksContainer;

// ../withList/index.js

const withList = (Component, getList) => {
  return function WithList(props) 
    useEffect(async () => {
      // invoke getList and store data in state
    }, []);

    if (!loading) {
      return <Component data={list} {...props} />;
    } else {
      return <Loading />;
    }
  };
};

// ./__test__/index.js

  it("should render correct number of <Notebook />", async () => {
    const spy = jest
      .spyOn(notebooksApi, "getAll")
      .mockImplementation(() => Promise.resolve({ data: mockData }));
    renderComponent();
    await waitFor(() => expect(spy).toHaveBeenCalledTimes(1));
    // some assertions
  });

对于


共有1个答案

林修真
2023-03-14

我通过模拟整个notebooksApi模块解决了这个问题。

import {notebooksApi} from './somewhere/api/index'
jest.mock('./somewhere/api/index')

然后在我的测试用例中,我将其用作,

notebooksApi.getAll.mockResolvedvalue({data: mockData})
expect(notebooksApi.getAll).toHaveBeenCalledTimes(1)

我还是不明白之前用开玩笑时的奇怪行为。spyOn,我会继续调查,并相应地更新答案。

 类似资料:
  • 我试图在同一个类中编写两个testng测试(使用Selenium webdriver)——一个登录应用程序,另一个创建一个新帐户。 这些是我遵循的步骤-使用@BeforeClass在Firefox浏览器上打开应用程序 > 登录网站的第一个测试 } 创建新帐户的第二个测试 } 我的问题是,当我运行这个testng测试时,我在第二个测试中遇到异常:org。openqa。硒。NoTouchElement

  • 我使用Jest框架,并有一个测试套件。我想关闭/跳过我的一个测试。 谷歌文档并没有给我答案。 你知道要查的答案或信息来源吗?

  • 我对Jest是新手,目前只是在玩一些现有功能的测试。我有一个函数,它获取一个数据数组(来自JSON文件),并将其映射到特定的位置,绘制点。 这是功能点: plotPoint将JSON数据作为参数。该函数之所以有效,是因为它在控制台中正确记录数据,而其他功能按预期工作。 但测试总是失败: 绘图点。测验js 返回此错误: 我认为可能函数是在jsonfile之前的测试中运行的。json已加载,因此我尝试

  • 问题内容: 我正在使用以下外壳程序脚本将一个文件的内容查找到另一个文件中: 我正在执行脚本,但未显示CSV文件中的内容。我的contents.txt文件还包含CSV文件中的数字,例如或。我的工作有什么问题吗? 问题答案: 本身能够做到。只需使用标志: 是每行包含一个模式的文件;并且是要在其中进行搜索的东西文件。 请注意,即使每行的内容看起来像一个正则表达式,也要强制将每行视为一个模式,您应该使用f

  • surefire插件是 我已经给了mvn测试命令,但它仍然在日志中给出零测试。有没有人能帮助我如何通过Maven运行junit test.java文件?

  • 问题内容: JavaScript中是否有类似于CSS的东西,允许您在另一个JavaScript文件中包含一个JavaScript文件? 问题答案: JavaScript的旧版本没有导入,包含或要求,因此已经开发了许多解决此问题的方法。 但是自2015年(ES6)起,JavaScript有了ES6模块标准即可在Node.js中导入模块,大多数现代浏览器也支持该模块。 为了与旧浏览器的兼容性,这样的构