{ // ... }) mo-6ren">
gpt4 book ai didi

javascript - Jest 测试为 eventemitter 对象发出事件 (http)

转载 作者:行者123 更新时间:2023-12-01 00:05:14 24 4
gpt4 key购买 nike

假设以下nodejs代码

const server = http.listen(8080,'127.0.0.1')
.on("error", err => {
// ...
})

module.exports = server;

如何使用 jest 编写测试来发出 http“错误”事件(以覆盖错误事件处理程序)?

最佳答案

由于您在模块范围内创建了服务器,因此当您 requireimport server.js 时,代码将立即执行。在需要此模块之前,您需要 stub http.createServer

为了测试.on(error,callback)方法,你应该使用mockImplementationmockImplementationOnce,这样当被模拟的服务器调用被模拟的服务器时.on('error', callback),您将在测试用例中获得原始回调。这意味着handler相当于callback。当您调用handler(mError)时,模拟的错误对象将被传递到原始回调中。然后你可以使用这个mError测试你的代码逻辑。

这是单元测试解决方案:

server.js:

const http = require('http');
const server = http.createServer();

server.listen(8080, '127.0.0.1').on('error', (err) => {
console.log(err);
});

module.exports = server;

server.test.js:

const http = require('http');

describe('60435647', () => {
it('should handle error', () => {
const mError = new Error('network');
const mServer = {
listen: jest.fn().mockReturnThis(),
on: jest.fn().mockImplementationOnce((event, handler) => {
// handler is the original callback, the mError variable will be passed into the original callback.
handler(mError);
}),
};
const createServerSpy = jest.spyOn(http, 'createServer').mockImplementationOnce(() => mServer);
const logSpy = jest.spyOn(console, 'log');
require('./server');
expect(createServerSpy).toBeCalledTimes(1);
expect(mServer.listen).toBeCalledWith(8080, '127.0.0.1');
expect(mServer.on).toBeCalledWith('error', expect.any(Function));
expect(logSpy).toBeCalledWith(mError);
});
});

100%覆盖率的单元测试结果:

 PASS  stackoverflow/60435647/server.test.js
60435647
✓ should handle error (459ms)

console.log node_modules/jest-environment-enzyme/node_modules/jest-mock/build/index.js:866
Error: network
at Object.<anonymous> (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/stackoverflow/60435647/server.test.js:5:20)
at Object.asyncJestTest (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:100:37)
at resolve (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/node_modules/jest-jasmine2/build/queueRunner.js:43:12)
at new Promise (<anonymous>)
at mapper (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/node_modules/jest-jasmine2/build/queueRunner.js:26:19)
at promise.then (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/node_modules/jest-jasmine2/build/queueRunner.js:73:41)
at process._tickCallback (internal/process/next_tick.js:68:7)

-----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
-----------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
server.js | 100 | 100 | 100 | 100 |
-----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 3.772s, estimated 6s

关于javascript - Jest 测试为 eventemitter 对象发出事件 (http),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60435647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com