第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 Jest 在這種情況下測試 Express router catch 分支?

如何使用 Jest 在這種情況下測試 Express router catch 分支?

烙印99 2023-03-24 15:09:14
我有一個包含兩條路線的文件。路線/index.jsconst express = require('express')const router = express.Router()router.get('', (req, res, next) => {  try {    res.status(200).render('../views/')  } catch (error) {    next(error)  }})router.get('*', (req, res, next) => {  try {    res.status(404).render('../views/not-found')  } catch (error) {    next(error)  }  })module.exports = router我想測試 catch 分支。一個明顯的問題是我無法偽造 router.get 的回調(diào)所做的事情,因為那樣我的測試將毫無意義,我會修改我想要測試的東西。我可以向這些特定路由發(fā)送超測請求,但我無法控制發(fā)生的情況。我想避免創(chuàng)建硬編碼路由,這樣我就可以檢查下一個函數(shù)是否調(diào)用了中間件。如果我理解正確的話,如果我在 try 塊中發(fā)生其他事情(比如數(shù)據(jù)庫查詢),那么我可以模擬它來拋出錯誤。但是我那里沒有發(fā)生任何其他事情。這是我無法解決的問題:如果我模擬服務(wù)器的功能,那么我不會測試我已經(jīng)擁有的東西,而是測試其他東西,所以這樣做沒有意義。也許我誤解了事情是如何工作的,但據(jù)我所知,唯一的選擇是以某種方式模擬 res.status 或 res.render 所做的事情(存根以便它們拋出錯誤),所以以某種方式模擬 Supertest 所做的事情,但我不知道該怎么做。任何幫助將不勝感激!
查看完整描述

1 回答

?
至尊寶的傳說

TA貢獻1789條經(jīng)驗 獲得超10個贊

單元測試解決方案:


route.js:


const express = require('express');

const router = express.Router();


router.get('', (req, res, next) => {

  try {

    res.status(200).render('../views/');

  } catch (error) {

    next(error);

  }

});


router.get('*', (req, res, next) => {

  try {

    res.status(404).render('../views/not-found');

  } catch (error) {

    next(error);

  }

});


module.exports = router;

route.test.js:


describe('64051580', () => {

  afterEach(() => {

    jest.resetModules();

    jest.restoreAllMocks();

  });

  it('should render views', () => {

    const express = require('express');

    const mRouter = { get: jest.fn() };

    jest.spyOn(express, 'Router').mockImplementationOnce(() => mRouter);

    const mReq = {};

    const mRes = { status: jest.fn().mockReturnThis(), render: jest.fn() };

    const mNext = jest.fn();

    mRouter.get.mockImplementation((path, callback) => {

      if (path === '') {

        callback(mReq, mRes, mNext);

      }

    });

    require('./route');

    expect(mRes.status).toBeCalledWith(200);

    expect(mRes.render).toBeCalledWith('../views/');

  });


  it('should handle error', () => {

    const express = require('express');

    const mRouter = { get: jest.fn() };

    jest.spyOn(express, 'Router').mockImplementationOnce(() => mRouter);

    const mReq = {};

    const mErr = new Error('parse');

    const mRes = {

      status: jest.fn().mockReturnThis(),

      render: jest.fn().mockImplementationOnce(() => {

        throw mErr;

      }),

    };

    const mNext = jest.fn();

    mRouter.get.mockImplementation((path, callback) => {

      if (path === '') {

        callback(mReq, mRes, mNext);

      }

    });

    require('./route');

    expect(mNext).toBeCalledWith(mErr);

  });


  it('should render 404 not found view', () => {

    const express = require('express');

    const mRouter = { get: jest.fn() };

    jest.spyOn(express, 'Router').mockImplementationOnce(() => mRouter);

    const mReq = {};

    const mRes = { status: jest.fn().mockReturnThis(), render: jest.fn() };

    const mNext = jest.fn();

    mRouter.get.mockImplementation((path, callback) => {

      if (path === '*') {

        callback(mReq, mRes, mNext);

      }

    });

    require('./route');

    expect(mRes.status).toBeCalledWith(404);

    expect(mRes.render).toBeCalledWith('../views/not-found');

  });

});

帶有覆蓋率報告的單元測試結(jié)果:


 PASS  src/stackoverflow/64051580/route.test.js

  64051580

    ? should render views (656ms)

    ? should handle error (17ms)

    ? should render 404 not found view (16ms)


----------|----------|----------|----------|----------|-------------------|

File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |

----------|----------|----------|----------|----------|-------------------|

All files |    90.91 |      100 |      100 |    90.91 |                   |

 route.js |    90.91 |      100 |      100 |    90.91 |                16 |

----------|----------|----------|----------|----------|-------------------|

Test Suites: 1 passed, 1 total

Tests:       3 passed, 3 total

Snapshots:   0 total

Time:        4.28s, estimated 10s


查看完整回答
反對 回復(fù) 2023-03-24
  • 1 回答
  • 0 關(guān)注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號