【发布时间】:2020-09-16 11:24:13
【问题描述】:
我是单元测试新手,并尝试为我的控制器 (ProgramsController) 编写测试。据我了解,我想模拟我的 programService 并返回值。
我真的很感激有人可以解决这个问题。然后我可以得到想法并为其他服务编写笑话测试。
我尝试如下并得到错误
ProgramsController.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;
ProgramService.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;
test.spec.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)*** ---------
test.spec.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 });
});
});
【问题讨论】:
标签: node.js unit-testing jestjs