簡體   English   中英

如何為節點控制器編寫 Jest 單元測試

[英]How to write Jest unit test for node controller

我是單元測試的新手,並試圖為我的控制器 (ProgramsController) 編寫測試。根據我的理解,我想模擬我的programService並返回值。 我真的很感激有人可以解決這個問題。然后我可以得到想法並為其他服務編寫玩笑測試。

我嘗試如下並出錯

程序控制器.js

class ProgramsController {
    constructor() {
        this.programService = new ProgramService();
    }
    async subscribe(req, res) {
        const { userId, uuid, msisdn, body: { programId } } = req;
        const data = { userId, programId, msisdn, uuid }

        const subscribe = await this.programService.subscribeUser(data);
        res.send({
            status: true,
            message: constant.MSG.SUCCESS,
            friendly_message: constant.MSG.SUCCESS,
            data: subscribe
        }
    }
}
module.exports = ProgramsController;

程序服務.js

class ProgramService {

    constructor() {
        this.subscriber = new Subscriber();
        this.subsciberProgram = new SubsciberProgram()
    }

    async subscribeUser(data) {
        try {
            const { msisdn, userId, programId, uuid } = data;
                ...

            return subscribedData;

        } catch (error) {
            throw error;
        }
    }
}
module.exports = ProgramService;

測試規范.js

const ProgramsService = require('../src/services/program/programService')
const ProgramsController = require('../src/controllers/programs/programsController')
const programController = new ProgramsController()
const programsService = new ProgramsService()


describe("Check method \'subscribe\' ", () => {
    it('should retrieve success', async () => {

        const serviceRecord = { userId: 1, programId: 1, msisdn: '56768382967', uuid: '46651a19-3ef1-4149-818e-9bd8a5f359ef' };

        jest.spyOn(programsService, 'subscribeUser').mockResolvedValueOnce(serviceRecord);

        const mReq = { body: { programId: 1 }, userId: 1, msisdn: '56768382967', uuid: '46651a19-3ef1-4149-818e-9bd8a5f359ef' };
        const mRes = { status: jest.fn().mockReturnThis(), send: jest.fn() };


        await programController.subscribe(mReq, mRes);

        expect(programsService.subscribeUser).toBeCalledWith(serviceRecord);
        expect(mRes.status).toBeCalledWith(200);

        expect(mRes.send).toBeCalledWith({ program_id: 1, amount: 5, no_of_questions: 10 });
    });
});

玩笑測試

------- *** 更新(@tmhao2005)*** ---------

測試規范.js

const ProgramsController = require('../src/controllers/programs/programsController')

const serviceRecord = { userId: 1, programId: 1, msisdn: '56768382967', uuid: '46651a19-3ef1-4149-818e-9bd8a5f359ef' };

// Mock subscribe user fn
const mockSubscribeUser = jest.fn().mockResolvedValue(serviceRecord);

// Mock the service
class MockService {
  subscribeUser = mockSubscribeUser;
}

// Apply the mock before the test run
jest.mock('../src/services/program/programService', () => MockService)

describe("Check method \'subscribe\' ", () => {
  it('should retrieve success', async () => {
    const mReq = { body: { programId: 1 }, userId: 1, msisdn: '56768382967', uuid: '46651a19-3ef1-4149-818e-9bd8a5f359ef' };
    const mRes = { status: jest.fn().mockReturnThis(), send: jest.fn() };

    const programController = new ProgramsController()
    await programController.subscribe(mReq, mRes);

    expect(mockSubscribeUser).toBeCalledWith(serviceRecord);
    expect(mRes.status).toBeaCalledWith(200);

    expect(mRes.send).toBeCalledWith({ program_id: 1, amount: 5, no_of_questions: 10 });
  });
});

在此處輸入圖片說明

這里的問題是您測試中的ProgramsService實例與您的實際代碼不同。 在這種情況下,您只需使用jest.mock方法模擬整個模塊ProgramsService jest.mock 這是這個想法的片段:

const ProgramsController = require('../src/controllers/programs/programsController')
const serviceRecord = { userId: 1, programId: 1, msisdn: '56768382967', uuid: '46651a19-3ef1-4149-818e-9bd8a5f359ef' };

// Mock subscribe user fn
const mockSubscribeUser = jest.fn().mockResolvedValue(serviceRecord);

// Apply the mock before the test run
jest.mock('../src/services/program/programService', () => class MockService {
  subscribeUser = mockSubscribeUser;
})

describe("Check method \'subscribe\' ", () => {
  it('should retrieve success', async () => {
    const mReq = { body: { programId: 1 }, userId: 1, msisdn: '56768382967', uuid: '46651a19-3ef1-4149-818e-9bd8a5f359ef' };
    const mRes = { status: jest.fn().mockReturnThis(), send: jest.fn() };

    const programController = new ProgramsController()
    await programController.subscribe(mReq, mRes);

    expect(mockSubscribeUser).toBeCalledWith(serviceRecord);
    expect(mRes.status).toBeaCalledWith(200);

    expect(mRes.send).toBeCalledWith({ program_id: 1, amount: 5, no_of_questions: 10 });
  });
});


暫無
暫無

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

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