我正在开发一个简单的 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) 我尝试使用 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) 我已将笑话添加到我的团队前端开发流程中。现在覆盖率确实很低,大约为 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 检查新的代码覆盖率是否比推送更改之前的代码覆盖率更好?
我正在尝试使用 jest 运行一些集成测试以进行反应。运行测试时,我收到以下错误UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_PROTOCOL]: Protocol "http:" not supported. Expected "https:" 。最初,我虽然与 msw 模拟我的 api 调用有关,但即使在禁用 msw 服务器之后,我仍然遇到此错误。
我在我的应用程序中使用 axios 发出 http 请求,并且所有 URL 都设置为使用 HTTPS。我还在安装文件中告诉 jest 并jest.config在模拟 origin 时使用 https,但它仍然不起作用。还有什么想法我还可以尝试吗?
我有一个像这样定义的打字稿文件:
// 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 …
我有一个 nx 工作区,我正在尝试将其移动到笑话中。起初我收到一个关于 PointerEvent 未定义的错误。建议的解决方法是执行 Object.defineProperty(window, 'PointerEvent'... 我的工作区有超过 200 个库,因此在每个测试设置文件中添加它是不现实的,因此我创建了一个 npm 包来定义它。我在测试设置中导入它,就像导入 jest-preset-angular 一样。它在我转换的前 15 个库中工作,但最新的库在运行测试时抛出此错误。
我已将此库与我能想到的所有其他库进行了比较,没有任何区别。我完全没有主意了。说我对这项努力感到沮丧是轻描淡写的。希望那里有人有一个大型的 nx 存储库并已经处理了这个问题。似乎我得到的每个答案都假设我选择 nx 只有一个应用程序和一两个库。我无法提供存储库,因为这个错误是如此随机,我不知道如何重现它。je-test-helper 位于 node_modules 中,正如我所说的,它的所有其他相同用法都有效。
我有 2 个 db,一个用于开发,一个用于测试。我想在运行 jest test 时连接到测试数据库,我设置了 2 个.env配置,开发使用.env,测试使用.env.test。但单元测试无法通过connection.ts.
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\nRun Code Online (Sandbox Code Playgroud)\n无法创建连接,getConnection().isConnected = false并且\n getConnection(\'test\')(或\'default\')抛出“未找到连接”。错误。
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) 我正在使用 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) 我使用带有 ts-jest 的打字稿测试设置。在项目 tsconfig 中,isolatedModules 选项设置为 true。如果我用玩笑运行它们,这会禁用我的测试的类型检查。ts-jest 也有记录:https ://huafu.github.io/ts-jest/user/config/isolatedModules
为什么会发生这种情况?对于除了测试之外的正常构建过程,isolatedModules 选项不会禁用类型检查。另外,打字稿文档没有提到诸如禁用此选项的类型检查之类的内容:https://www.typescriptlang.org/tsconfig#isolatedModules 所以我不明白为什么它不能以相同的方式进行测试
我有一个像这样的函数
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-US,fr一下
任何有助于理解您应该如何嘲笑这一点的帮助将不胜感激。
ts-jest ×10
jestjs ×9
typescript ×5
reactjs ×2
aws-lambda ×1
enzyme ×1
fetch ×1
frontend ×1
javascript ×1
jsdom ×1
msw ×1
navigator ×1
nrwl-nx ×1
react-hooks ×1
response ×1
typeorm ×1
unit-testing ×1