首页 > 解决方案 > Node.js Express.js:用于单元测试目的的模拟请求对象

问题描述

我有一个方法来检查请求查询字符串是否有一些参数:

checkMandatoryQueryParams (mandatoryQueryParams: String[],  req: Request): void {
    let result = true;
    mandatoryQueryParams.forEach((element, idx) => {
        if (!req.query.hasOwnProperty(element)) {
            result = false;
        }
    });
    return result;
}

在单元测试中,我需要模拟测试请求,例如:

describe('Utils', () => {

    it('checkMandatoryQueryParams', () => {
        const req: Request = new Request(); // pseudo-code
        req.query = "?foo=test&bar=test";   // pseudo-code
        expect( checkMandatoryQueryParams(['foo', 'bar'], req) ).toEqual(true);
    });
});

我如何模拟快递请求?

标签: unit-testingtypescriptexpress

解决方案


两种选择:

创建自己的模拟对象:

describe('Utils', () => {
    /**
     * Mocked Express Request object
     */
    let mockedReq;

    beforeEach(() => {
        mockedReq = {
            query: {}
        };
    })

    it('checkMandatoryQueryParams', () => {
        const req = mockedReq;
        req.query = "?foo=test&bar=test";   // pseudo-code
        expect(checkMandatoryQueryParams(['foo', 'bar'], req) ).toEqual(true);
    });
});

使用手动 mocks,类似于上面:

describe('Utils', () => {
    /**
     * Mocked Express Request object
     */
    let mockedReq;

    beforeAll(() => {
        mockedReq = jest.fn().mockImplementation(() => {
            const req = {
                // Implementation
            };
            return req;
        });
    });

    beforeEach(() => mockedReq.mockReset())

    it('checkMandatoryQueryParams', () => {
        const req = mockedReq;
        req.query = "?foo=test&bar=test";   // pseudo-code
        expect(checkMandatoryQueryParams(['foo', 'bar'], req) ).toEqual(true);
    });
});

推荐阅读