簡體   English   中英

jest 測試為 eventemitter 對象發射事件 (http)

[英]jest test emitting events for eventemitter objects (http)

假設以下 nodejs 代碼

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

module.exports = server;

如何使用 jest 編寫測試以發出 http“錯誤”事件(以覆蓋錯誤事件處理程序)?

由於您在模塊范圍內創建了一個服務器,因此當您requireimport server.js時,代碼將立即執行。 在需要此模塊之前,您需要存根http.createServer

為了測試.on(error, callback)方法,您應該使用mockImplementationmockImplementationOnce ,因此當被.on('error', callback)服務器調用被.on('error', callback) ,您將在測試用例中獲得原始回調。 這意味着handler相當於callback 當您調用handler(mError)handler(mError)的錯誤對象將被傳遞到原始callback 然后你可以使用這個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM