标签: ts-jest

模拟 AWS 服务和 Lambda 最佳实践

我正在开发一个简单的 AWS lambda 函数,该函数由 DynamoDB Streams 事件触发,并且应该将除REMOVE事件之外的所有记录转发到 SQS 队列。该功能按预期工作,没有什么意外。

我想编写一个单元测试来测试在事件发生时不向 SQS 提交任何内容的行为DELETE。我首先使用aws-sdk-mock尝试过此操作。正如您在函数代码中看到的,我尝试通过在处理程序代码之外初始化 SQS 客户端来遵守 lambda 最佳实践。显然,这会阻止aws-sdk-mock模拟 SQS 服务(GitHub 上有一个与此相关的问题: https: //github.com/dwyl/aws-sdk-mock/issues/206)。

然后,我尝试使用jest来模拟 SQS ,这需要更多代码才能正确完成,但我最终遇到了同样的问题,需要将 SQS 的初始化放在处理程序函数中,这违反了 lambda 最佳实践。

如何为此函数编写单元测试,同时让 SQS client() 的初始化const sqs: SQS = new SQS()在处理程序之外进行?我是否以错误的方式嘲笑服务,或者是否需要更改处理程序的结构以使其更易于测试?

我知道这个 lambda 函数非常简单,单元测试可能是不必要的,但我必须用更复杂的逻辑编写更多的 lambda,我认为这个非常适合演示这个问题。

索引.ts

import {DynamoDBStreamEvent, DynamoDBStreamHandler} from "aws-lambda";
import SQS = require("aws-sdk/clients/sqs");
import DynamoDB = require("aws-sdk/clients/dynamodb");

const sqs: SQS = new SQS()

export const handleDynamoDbEvent: DynamoDBStreamHandler …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services typescript jestjs aws-lambda ts-jest

5
推荐指数
1
解决办法
2986
查看次数

如何模拟获取响应对象

我尝试使用 ts-jest 模拟获取响应,但遇到打字稿错误

import { mocked } from 'ts-jest/utils';
import fetch from 'node-fetch';

import { getInstallationAccessToken } from './index';

const mockedFetch = mocked(fetch, true);

describe('getInstallationAccessToken', () => {
  const TODAY = new Date();
  const TOMORROW = new Date();
  TOMORROW.setDate(TODAY.getDate() + 1);

  beforeEach(() => {
    mockedFetch.mockResolvedValue({
      status: 200,
      json: async () => ({
        token: 'MOCKED_GITHUB_INSTALLATION_ACCESS_TOKEN',
        expires_at: TOMORROW.toISOString()
      })
    });
    jest.clearAllMocks();
  });

  test('generates github app jwt token', async () => {
    await getInstallationAccessToken();
    expect(mockedJwt.sign).toBeCalledTimes(1);
  });
})
Run Code Online (Sandbox Code Playgroud)

在此示例中,我收到以下错误:

Argument of type '{ status: …
Run Code Online (Sandbox Code Playgroud)

response fetch typescript jestjs ts-jest

5
推荐指数
1
解决办法
1万
查看次数

Jest动态调整覆盖阈值

我已将笑话添加到我的团队前端开发流程中。现在覆盖率确实很低,大约为 1.2%,目标是确保我们不断增长——例如,每次提交代码覆盖率至少不会降低。

我能够设置笑话来检查代码覆盖率

collectCoverage: true,
    collectCoverageFrom: [
        "<rootDir>/src/**/*.{ts,tsx}",
    ],
    coverageThreshold: {
        global: {
            "statements": 1.26,
            "branches": 1.32,
            "functions": 1.1,
            "lines": 1.25,
        },
    },
Run Code Online (Sandbox Code Playgroud)

但正如您所看到的,这些值是静态的,当我们提高覆盖范围时,我必须手动更新它们。

有没有一种方法可以告诉 jest 检查新的代码覆盖率是否比推送更改之前的代码覆盖率更好?

javascript frontend jestjs ts-jest

5
推荐指数
0
解决办法
324
查看次数

Jest jsdom 协议“http:”不支持

我正在尝试使用 jest 运行一些集成测试以进行反应。运行测试时,我收到以下错误UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_PROTOCOL]: Protocol "http:" not supported. Expected "https:" 。最初,我虽然与 msw 模拟我的 api 调用有关,但即使在禁用 msw 服务器之后,我仍然遇到此错误。

我在我的应用程序中使用 axios 发出 http 请求,并且所有 URL 都设置为使用 HTTPS。我还在安装文件中告诉 jest 并jest.config在模拟 origin 时使用 https,但它仍然不起作用。还有什么想法我还可以尝试吗?

jsdom reactjs jestjs ts-jest msw

5
推荐指数
0
解决办法
418
查看次数

玩笑中的运行时错误 - TypeError:类扩展值未定义不是构造函数或 null

我有一个像这样定义的打字稿文件:

// myType.tsx

import { Foo } from 'foo';
[...]
export interface MyType extends IDisposable {
[...]
}

export abstract class MyTypeBase implements MyType {
  innerFoo: Foo | null | undefined;
  get foo(): Foo {
    return this.innerFoo;
  }

  [...]
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试测试另一个依赖于此的类MyType,并且我想模拟foo()吸气剂。

在我的测试文件中,将以下内容添加到文件中后:

[...]
import { MyType } from 'path/to/MyType';
[...]
jest.mock('path/to/MyType', () => {
  return jest.fn().mockImplementation(() => {
    return {foo: () => mockFoo}; //mockFoo is defined earlier in the file.
  })
});
Run Code Online (Sandbox Code Playgroud)

运行测试时出现错误: Class extends value …

typescript jestjs ts-jest

5
推荐指数
1
解决办法
1万
查看次数

在nx中使用jest时找不到模块

我有一个 nx 工作区,我正在尝试将其移动到笑话中。起初我收到一个关于 PointerEvent 未定义的错误。建议的解决方法是执行 Object.defineProperty(window, 'PointerEvent'... 我的工作区有超过 200 个库,因此在每个测试设置文件中添加它是不现实的,因此我创建了一个 npm 包来定义它。我在测试设置中导入它,就像导入 jest-preset-angular 一样。它在我转换的前 15 个库中工作,但最新的库在运行测试时抛出此错误。

在此输入图像描述

我已将此库与我能想到的所有其他库进行了比较,没有任何区别。我完全没有主意了。说我对这项努力感到沮丧是轻描淡写的。希望那里有人有一个大型的 nx 存储库并已经处理了这个问题。似乎我得到的每个答案都假设我选择 nx 只有一个应用程序和一两个库。我无法提供存储库,因为这个错误是如此随机,我不知道如何重现它。je-test-helper 位于 node_modules 中,正如我所说的,它的所有其他相同用法都有效。

jest-preset-angular ts-jest nrwl-nx

5
推荐指数
1
解决办法
3374
查看次数

TypeORM 与 Jest 单元测试的连接

我有 2 个 db,一个用于开发,一个用于测试。我想在运行 jest test 时连接到测试数据库,我设置了 2 个.env配置,开发使用.env,测试使用.env.test。但单元测试无法通过connection.ts.

\n

更新目录架构

\n
app\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .env\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .env.test\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 loadEnv.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ormconfig-cli.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 connection.ts\n\xe2\x94\x82     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.module.ts\n\xe2\x94\x82\xc2\xa0   \xc2\xa0\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 user\n\xe2\x94\x82     \xe2\x94\x82\xc2\xa0\xc2\xa0  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 entities\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0  \xe2\x94\x82\xc2\xa0\xc2\xa0   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80  user.entity.ts\n\xe2\x94\x82\xc2\xa0    \xe2\x94\x82\xc2\xa0\xc2\xa0  \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 user.module.ts\n\xe2\x94\x82\xc2\xa0\xc2\xa0   \xe2\x94\x82\xc2\xa0\xc2\xa0 \xc2\xa0\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 user.resolver.spec.ts\n\xe2\x94\x82\xc2\xa0\xc2\xa0   \xe2\x94\x82\xc2\xa0\xc2\xa0 \xc2\xa0\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 user.resolver.ts\n\xe2\x94\x82\xc2\xa0\xc2\xa0   \xe2\x94\x82\xc2\xa0\xc2\xa0 \xc2\xa0\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 user.service.spec.ts\n\xe2\x94\x82\xc2\xa0    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xc2\xa0\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 user.service.ts\n
Run Code Online (Sandbox Code Playgroud)\n

更新连接错误

\n

无法创建连接,getConnection().isConnected = false并且\n getConnection(\'test\')(或\'default\')抛出“未找到连接”。错误。

\n
app\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .env\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .env.test\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 loadEnv.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ormconfig-cli.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 connection.ts\n\xe2\x94\x82     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.module.ts\n\xe2\x94\x82\xc2\xa0 …
Run Code Online (Sandbox Code Playgroud)

jestjs typeorm ts-jest

5
推荐指数
1
解决办法
6302
查看次数

如何测试由 useEffect 上触发的 SetTimeout 修改的组件样式?

我正在使用 Jest/Enzyme 来测试 React/TypeScript 应用程序,并且我很难尝试编写一个测试来断言按钮是否在一段时间后显示:

这是要测试的组件的非常简化的版本:

import { StyledNotifyButton } from './styles'; //style-component element

const SomeComponent = (): ReactElement => {
  const [showNotifyButton, toggleNotifyButton] = useState(false);

  useEffect(() => {
    setTimeout(() => toggleNotifyButton(true), 5000);
  }, [toggleNotifyButton]);

  return (
    <div>
      <StyledNotifyButton visible={showNotifyButton} />
    </div>
  );
Run Code Online (Sandbox Code Playgroud)

这是测试:

 describe('< FailingTest >', () => {
  let wrapper: ReactWrapper;

  beforeAll(() => {
    wrapper = mount(<SomeComponent />);
  });

  it('should display the notify button only after X seconds', done => {
    let notifyButton = wrapper.find('StyledNotifyButton');

    jest.spyOn(React, 'useEffect').mockImplementation(f => …
Run Code Online (Sandbox Code Playgroud)

reactjs jestjs enzyme ts-jest react-hooks

5
推荐指数
1
解决办法
5090
查看次数

为什么isolatedModules选项在测试中禁用类型检查?

我使用带有 ts-jest 的打字稿测试设置。在项目 tsconfig 中,isolatedModules 选项设置为 true。如果我用玩笑运行它们,这会禁用我的测试的类型检查。ts-jest 也有记录:https ://huafu.github.io/ts-jest/user/config/isolatedModules

为什么会发生这种情况?对于除了测试之外的正常构建过程,isolatedModules 选项不会禁用类型检查。另外,打字稿文档没有提到诸如禁用此选项的类型检查之类的内容:https://www.typescriptlang.org/tsconfig#isolatedModules 所以我不明白为什么它不能以相同的方式进行测试

typescript jestjs ts-jest

5
推荐指数
0
解决办法
1310
查看次数

如何在玩笑中模拟 window.navigator.language 27

我有一个像这样的函数

export function formatDate(date: string){
    return new Intl.DateTimeFormat(navigator.language).format(new Date(date))
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试用 vanilla jest 编写单元测试(不使用 jsdom 库),但正如你所看到的,我需要能够模拟window.navigator.language.

到目前为止我已经尝试过了

test('UK date format', () => {
  Object.defineProperty(window.navigator, 'language', {value: 'en-GB', configurable: true})
  expect(window.navigator.language).toBe('en-GB')
})
Run Code Online (Sandbox Code Playgroud)

但我一生都无法理解你应该如何开玩笑地嘲笑 window.navigator 。

理想情况下,我希望能够在每次测试中模拟 window.navigator.language 的新值。这样我就可以进行测试en-USfr一下

任何有助于理解您应该如何嘲笑这一点的帮助将不胜感激。

unit-testing navigator typescript jestjs ts-jest

5
推荐指数
1
解决办法
3438
查看次数