[英]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.