首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用Jest期望mock函数被调用一次,但它被调用了零次

Jest是一个流行的JavaScript测试框架,用于编写和运行单元测试。它提供了丰富的API和功能,包括模拟函数(mock functions)的能力。

模拟函数是一种测试技术,用于模拟或替代真实函数的行为。在测试过程中,我们可以使用模拟函数来验证函数是否按预期被调用,以及函数的返回值是否符合预期。

在这个问题中,我们使用Jest的模拟函数来验证一个函数是否被调用了一次。具体的实现步骤如下:

  1. 首先,我们需要使用Jest提供的jest.fn()函数创建一个模拟函数。这个模拟函数将替代我们要测试的真实函数。
  2. 接下来,我们可以使用Jest提供的expect语法来断言模拟函数的调用情况。在这个问题中,我们期望模拟函数被调用一次,但实际上它被调用了零次。
  3. 使用Jest提供的toHaveBeenCalled匹配器来验证模拟函数是否被调用过。如果模拟函数被调用了一次,toHaveBeenCalled将返回true,否则返回false

下面是一个示例代码:

代码语言:txt
复制
// 导入要测试的模块或函数
const myFunction = require('./myFunction');

// 创建模拟函数
const mockFunction = jest.fn();

// 调用被测试的函数,并传入模拟函数作为参数
myFunction(mockFunction);

// 验证模拟函数是否被调用一次
expect(mockFunction).toHaveBeenCalled();

在这个示例中,myFunction是我们要测试的函数,它接受一个函数作为参数。我们将模拟函数mockFunction传入myFunction,并期望它被调用一次。最后,使用expecttoHaveBeenCalled来验证模拟函数的调用情况。

对于这个问题,如果模拟函数没有被调用一次,可能有以下几个原因:

  1. 测试代码中存在错误,导致模拟函数没有被正确调用。
  2. 被测试的函数没有按预期的方式调用模拟函数。
  3. 被测试的函数中存在逻辑错误,导致模拟函数没有被调用。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Vue 应用单元测试的策略与实践 02 - 单元测试基础

/sound-player 这个文件当中 export 出来的,而 Mock 之后我们的测试就可以使用 Mock 所返回的数据或方法,从而保证模块所返回的内容是我们所期望的。...这时需要注意的是,该模板的所有功能都已经 Mock 掉,而不会再从原模块当中返回,所以我们就需要重新实现该模块中的所有功能。...比如说上文中的 video 模块中的 play() 方法已经 spy 过,那么之后 play() 方法只要被调用过,我们就能判断其是否执行,甚至执行的次数。 如何 Mock 全局的方法?...这种方式侵入性比较强,对测试语句不友好且违背了 Given/When/Then 的三段式套路,就像回地狱一样的道理,如果让 done() 充斥着测试那么代码也就变得混乱。...唯一需要注意的是, 额外的expect.assertions(number) 其实是验证在测试期间所调用的断言数量,这在测试多层异步代码时很有用,以确保实际调用中的断言次数。 意犹未尽吗?

2.2K20
  • 万字详文:彻底搞懂 Jest 单元测试框架

    我们还将导入函数,以便执行测试中的代码。...我们将提供数字为 1 和 2,并期望输出 3。 test 它需要两个参数:一个用于描述测试块的字符串,以及一个用于包装实际测试的回函数。...expect 是一个断言,该语句使用输入 1 和 2 调用函数中的 sum 方法,并期望输出 3。 toBe 是一个匹配器,用于检查期望值,如果不符合预期结果则应该抛出异常。...模拟 在复杂的测试场景,我们一定绕不开一个 Jest 术语:模拟(mock) 在 Jest 文档中,我们可以找到 Jest 对模拟有以下描述:”模拟函数通过抹去函数的实际实现、捕获对函数调用,以及在这些调用中传递的参数...而 jest.fn 的实现也不难,这里我们使用一个闭包 mockFn 把替换的函数和参数给存起来,方便后续测试检查和统计调用数据。

    7.8K20

    使用Jest测试包含setTimeout调用函数踩坑记录

    回到我们的测试用例,原因也就明确了:调用enqueueJob之后,catch中的回加入了队列,而随后的delay则相当于直接调用了setTimeout(前面说到Promise对象构造时的回函数是立刻执行的...中的回也就有机会被调用了。...根据Jest的官方文档,调用这个函数后,所有队列中的“微任务”都会被立刻执行,这里的目的就是保证catch回立刻调用使用jest.advanceTimersByTime(6000)代替await...提供的spy函数,对setTimeout函数进行了拦截侦听,调用时不做任何事。...在我们调用完enqueueJob之后,我们通过对setTimeout的mock数据进行断言,来检查enqueueJob是否调用了setTimeout并传入了预期的时长。

    6.8K60

    那些年错过的React组件单元测试(上)

    done参数,在fetchData的回函数调用了done。...这里我们思考一种场景:如果使用done来测试回函数(包含定时器场景,如setTimeout),由于定时器我们设置了 一定的延时(如 3s)后执行,等待 3s 后会发现测试通过了。...Mock 介绍jest中的mock之前,我们先来思考一个问题:为什么要使用mock函数? 在项目中,一个模块的方法内常常会去调用另外一个模块的方法。...).toBeCalled(); // 断言mockFn调用了一次 expect(mockFn).toBeCalledTimes(1); // 断言mockFn传入的参数为1, 2, 3...jest.spyOn() jest.spyOn()方法同样创建一个mock函数,但是该mock函数不仅能够捕获函数调用情况,还可以正常的执行spy的函数

    5K20

    Jest基本使用方法以及mock技巧介绍

    导读 Jest是由Facebook开发并维护的一套js的单元测试框架,之前在后台的nodejs项目里面第一次尝试使用,感觉还是非常容易上手的,功能也比较强大。...2  Jestmock技巧介绍 2.1  基本的mock 2.1.1  Mock一个函数 方法的mock 非常简单,使用jest.fn 就可以非常简单的mock一个函数。...如下面的例子:代码里面有一个函数叫forEach。 ? 此函数可以简单使用下面方法mock,并且jest提供一些方法可以确保查看mock函数调用的情况: ?...2.2.2  jest.mock()直接在单元测试里面mock 模块 例如我们很多产品代码里面会使用fs文件读取文件, 在单元测试中, 我们并不需要真去调用fs读取文件, 就可以考虑把fs模块mock掉...如下面的例子,在使用了mock之后,随时可以使用。 ?

    8.5K50

    【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门

    Mock 的几大功能 创建 mock function,在测试中使用,用来测试回 手动 mock,覆盖第三方实现,狸猫换太子 三大 API 实现不同粒度的时间控制 函数测试 function mockTest...// 创建一个假的函数实现 const mockCB = jest.fn() mockTest(true, mockCB) // 函数是否调用过了 expect(mockCB)....toHaveBeenCalled() // 是否参数调用 expect(mockCB).toHaveBeenCalledWith(42) // 调用的次数 expect(mockCB...).toHaveBeenCalledTimes(1) // 函数调用 console.log(mockCB.mock.calls); // 函数调用结果 console.log(mockCB.mock.results...jest.runOnlyPendingTimers() // 调用次数 expect(callback).toHaveBeenCalledTimes(1) // 上一次调用的参数

    1.3K20

    从echarts-for-react源码中学习如何写单元测试

    ,但它们的值是一样的,也是可以的 小结 对于有返回值的function,就是通过判断「返回值」,是否与「期望值」相等即可 这样的好处: ① 当有新需求要扩展该函数时,可以保证该函数的返回值仍保持不变,进而不会影响到使用到该函数的旧需求...② 当测试的函数比较复杂时,非常方便,不用了解内部的详细代码,只需返回值符合期望即可 如何测试ReactComponent 当我写完一个React组件时,我该如何测试它呢?...,只需关注返回的值(return xxx)即可, // 不能因为 onChartReady 而影响到「测试目标」,为了减少依赖,就使用了 mock function 即 jest.fn()...(return xxx)即可 为了减少依赖,所以使用了mock function即jest.fn() ② 通过component.props()获取到传到组件上的props ③ 通过expect(function...).toBeCalled(),判断函数调用 ④ 通过component.setProps(),来为组件传入新属性 ⑤ 通过component.update()来强制更新React组件,如果组件是ClassComponent

    6.2K50

    React + Redux Testing Library 单元测试

    }; }); }); 我们可以看到 jest.mock() 方法中的第二个参数是一个函数,那么我们就可以完全接管整个 ..../sound-player 这个文件当中 export 出来的,而 Mock 之后我们的测试就可以使用 Mock 所返回的数据或方法,从而保证模块所返回的内容是我们所期望的。...这时需要注意的是,该模板的所有功能都已经 Mock 掉,而不会再从原模块当中返回,所以我们就需要重新实现该模块中的所有功能。...当测试 action 的时候,我们需要增加一个 mocking 服务层——例如,我们可以把 API 调用抽象成服务,然后在测试文件中用 mock 服务响应所期望的 API 调用。...然后我们就可以使用 Jest 模拟一个 action 的行为再传给 store,而 actionClick 这个伪造函数能够让我们去断言该 action 是否调用过。

    2.4K10

    【干货分享】微信小程序单元测试攻略

    2,测代码包含复杂的环境因素需要处理或模拟,例如使用了storage、调用了接口、使用了环境变量等。 (图片来源:码农翻身公众号) 但无论如何,有价值的东西就应该去做,不应该知难而退嘛。...该方法和sinon.spy一样,生成函数的“间谍”,可以断言该函数的已调用次数、调用入参、调用返回等是否符合预期。...2.3.3 完整的断言方法 2.3.4 模拟数据mock测方法包含环境因素不能直接测试时,例如使用了localStorage,又或者测方法调用了接口,不希望测试时调用接口影响业务或降低测试速度...axios.get('/api').then(res => res.data)} // 测试代码B import axios from 'axios';jest.mock('axios'); // 模拟一次接收到的数据...函数覆盖率(function coverage):是否每个函数调用了? 3. 分支覆盖率(branch coverage):是否每个if代码块都执行了? 4.

    2.7K40

    Jest单元测试之旅—实践总结

    resolves/rejects:Jest会等待异步函数执行完毕该方法应该和async/await配合使用 手动调用done:在我们没有调用done之前,当前测试不会结束,直至调用done方法,有点类似回...每个方法都有不同的使用场景,每个API都会生成一个mock模拟函数Jest对模拟函数提供了很多方法给予我们模拟方法的返回、实现等等,可移至文档参考 jest.fn jest.fn主要是创建一个模拟函数...,用于代替我们的真实函数,可以通过该模块函数提供的方法获取调用信息(.mock方法)。...这里分别使用了jest.spyOn和jest.Mock两个方式对同一个方法进行3种不同编写方式的测试,在实际情况中我们应该选择合适的方法。...jest.mock模拟部分函数,这里使用了jest.requireActual,该方法主要是绕过模拟模块导出真实模块,然后通过jest.mock的工厂函数重新去定义该模拟模块的内容,这种方式就可以指定导出的模块具体哪些方法需要被模拟

    10.3K20

    Jest + React Testing Library 单测总结

    在组件单测中,有的时候我们可能只关注一个函数是否正确地调用了,或者只想要某个函数的返回值来支持该组件渲染逻辑是否正确,而并不关心这个函数本身的逻辑。...2.3.1 jest.fn() 通过 jest.fn(implementation) 可以创建 mock 函数。如果没有定义函数内部的实现,mock 函数会返回 undefined。...// 定义一个 mock函数,因为没有函数体,所以 mockFn 会 return undefined const mockFn = jest.fn(); // mockFn 调用 mockFn(...); // 虽然没有定义函数体,但是 mockFn 调用过了 expect(mockFn).toHaveBeenCalled(); const res = mockFn('a','b','c');...// 断言 mockFn 的执行后返回 undefined expect(res).toBeUndefined(); // 断言mockFn调用了两次 expect(mockFn).toBeCalledTimes

    4.6K20

    前端自动化测试

    包含单元测试运行器、断言库、Mock库 内置代码覆盖率报告 可以与Typescript一同使用 零配置,开箱即用 Mocha 仅仅是测试运行器,虽然灵活,需要自己配置很多东西。...这里可以首先简单的看一下,Jest+Enzyme的基本语法: Jest的API更多着力于定义测试、断言、mock库 定义测试: describe: 定义一个测试套件(test suite) it: 定义一个测试...(test) beforeEach: 定义一个回函数在每个测试之前执行 expect: 执行一个断言 jest.fn(): 创造一个mock函数 一些用于断言的方法: toEqual: 验证两个值是否相同...: 验证一个mock函数是否调用 toBeCalledWith: 验证一个mock函数是否传入指定的参数调用 一些用于mock的方法: mockImplementation: 提供mock函数的执行...mockReturnValue: mock函数调用返回一个值 Enzyme的API更多着重于渲染react组件和从dom树种检索指定的节点 下面是三种渲染组件的方法: shallow: 会渲染至虚拟

    2K20
    领券