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

如何正确地使笑话中的模拟抛错?

太叔弘壮
2023-03-14

我正在使用Jest测试我的GraphQL api。

我为每个查询/变异使用单独的测试套装

我有两个测试(每个测试都在一套单独的测试套件中),其中我模拟了一个用于突变的函数(即Meteor的callMethod)。

  it('should throw error if email not found', async () => {
    callMethod
      .mockReturnValue(new Error('User not found [403]'))
      .mockName('callMethod');

    const query = FORGOT_PASSWORD_MUTATION;
    const params = { email: 'user@example.com' };

    const result = await simulateQuery({ query, params });

    console.log(result);

    // test logic
    expect(callMethod).toBeCalledWith({}, 'forgotPassword', {
      email: 'user@example.com',
    });

    // test resolvers
  });

当我控制台时。日志(结果)我得到

{ data: { forgotPassword: true } }

这种行为不是我想要的,因为在. mockRecnValue中,我抛出了一个错误,因此期望结果有一个错误对象

然而,在这个测试之前,还进行了另一个测试

 it('should throw an error if wrong credentials were provided', async () => {
    callMethod
      .mockReturnValue(new Error('cannot login'))
      .mockName('callMethod');

它工作正常,抛出错误

我想问题是mock在测试完成后不会被重置。在我的玩笑中。conf.js我有clearMocks:true

每个测试套件都在一个单独的文件中,我在进行以下测试之前模拟函数:

import simulateQuery from '../../../helpers/simulate-query';

import callMethod from '../../../../imports/api/users/functions/auth/helpers/call-accounts-method';

import LOGIN_WITH_PASSWORD_MUTATION from './mutations/login-with-password';

jest.mock(
  '../../../../imports/api/users/functions/auth/helpers/call-accounts-method'
);

describe('loginWithPassword mutation', function() {
...

使现代化

当我替换时。使用模拟返回值。模拟实施一切按预期进行:

callMethod.mockImplementation(() => {
  throw new Error('User not found');
});

但这并不能解释为什么在另一个测试中。


共有3个答案

杭曦
2023-03-14

对于promise,可以使用https://jestjs.io/docs/mock-function-api#mockfnmockrejectedvaluevalue

test('async test', async () => {
  const asyncMock = jest.fn().mockRejectedValue(new Error('Async error'));

  await asyncMock(); // throws "Async error"
});

对于测试是否引发了错误,可以使用https://eloquentcode.com/expect-a-function-to-throw-an-exception-in-jest

const func = () => {
  throw new Error('my error')
}
it('should throw an error', () => {
    expect(func).toThrow()
})
劳灵均
2023-03-14

角笑话:

import { throwError } from 'rxjs';

yourMockInstance.mockImplementation(() => {
  return throwError(new Error('my error message'));
});
郑翰海
2023-03-14

更改。使用模拟返回值。模拟实现

yourMockInstance.mockImplementation(() => {
  throw new Error();
});

如果这是一个promise,你也可以拒绝www.jestjs.io/docs/en/asynchronous#resolves--rejects

 类似资料:
  • 我尝试在vuex的操作中使用vue路由器,这在本地主机上运行良好。 然而,当我试图通过从存储文件导入操作来准备存储(模拟)时,我得到了错误。 你能帮我解决这个问题吗? 版本 错误msg app/src/main。js app/src/store/main。js 应用程序/src/路由器/main.js 应用程序/测试/组件/主。测验js 组件

  • 我有下面的打字稿类,我想测试在笑话。 这是我的测试: 如何模拟MyClass中使用的foo函数,以使测试通过?

  • 如何在玩笑中清除模拟函数中的间谍?如果原始函数不是的话,工作得非常好。如何正确清除中的所有间谍?这个问题可能是如何在单个测试基础上更改模拟实现[Jestjs]的重复,尽管我的问题描述了一个不涉及多个模块的更简单的场景。

  • 问题内容: 我有一个依赖于导出变量的文件。此变量设置为,但是如果需要,可以将其设置为手动设置,以防止下游服务请求时出现某些行为。 我不确定如何在Jest中模拟变量,以便更改测试和条件的值。 例: 问题答案: 如果将ES6模块语法编译为ES5,则此示例将起作用,因为最后,所有模块导出都属于同一对象,可以对其进行修改。 另外,您可以切换到raw commonjs 函数,并借助以下方法做到这一点:

  • 我试图使用ESLint linter与Jest测试框架。 Jest测试使用一些全局变量运行,比如,我需要告诉linter关于它的信息;但棘手的是目录结构,Jest将测试与源代码一起嵌入文件夹中,因此目录结构类似于: 通常,我会将所有测试放在一个目录下,我可以在那里添加一个文件来添加全局变量。。。但是我当然不想在每一个目录中添加文件。 目前,我刚刚将测试全局变量添加到了global文件中,但由于这意

  • 问题内容: 在尝试学习TDD的过程中,尝试学习单元测试并在python中使用模拟。慢慢掌握它,但不确定我是否正确执行此操作。预先警告:由于供应商API是预编译的2.4 pyc文件,因此我正在使用python 2.4进行卡住,因此我正在使用模拟0.8.0和unittest(不是unittest2) 在“ mymodule.py”中给出此示例代码 现在在我的测试用例文件“ test_myclass.p

  • 问题内容: 我的组件测试文件中有一个像这样的模拟模块 这些函数将在我的组件的渲染函数中调用以隐藏和显示某些特定功能。 我想对这些模拟函数的返回值的不同组合进行快照。 假设我有一个这样的测试用例 要运行此测试用例,我想更改模拟模块函数的返回值以使其动态变化 因为我已经一次导入了组件,所以我的模拟模块不会再次重新导入。所以它不会改变。我该如何解决? 问题答案: 您可以模拟该模块,以便它返回间谍并将其导

  • 我必须增加group_concat_max_len。我不能通过preparestatement来完成,也不能在mysql my.conf文件中完成。 我在mysql文档中发现,有一个选项可以在URL中传递会话变量。但是没有例子,我试着那样做: