【问题标题】:How to write Jest unit test for node controller如何为节点控制器编写 Jest 单元测试
【发布时间】: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


    【解决方案1】:

    这里的问题是您的测试中的ProgramsService 实例与您的实际代码不同。在这种情况下,您只需使用 jest.mock 方法简单地模拟整个模块 ProgramsService。这是这个想法的sn-p:

    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 });
      });
    });
    
    
    

    【讨论】:

    • 非常感谢。但我收到了这个错误`ReferenceError: MockService is not defined jest.mock('../src/services/program/programService', () => MockService) `
    • 你能把测试和你看到的错误截图吗?这很奇怪,因为MockService 是在那里定义的
    • 你是不是想复制被嘲笑的东西// Mock the service class MockService { subscribeUser = mockSubscribeUser; }
    • No.its there.i 已复制您的全部答案并放入我的 test.js 文件中
    • 嗯。您能否再次更新整个测试文件以反映我的更改?
    猜你喜欢
    • 2020-09-02
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2019-09-27
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多