【问题标题】:Jest mocking a function within another function开玩笑地在另一个函数中模拟一个函数
【发布时间】:2019-07-23 16:47:07
【问题描述】:

我进行了相当多的搜索,虽然有很多关于模拟函数的问题,但我找到的解决方案都不适用于我的设置,我不太清楚为什么。我有以下内容:

questionnaire-service.js

const service = require('./request-service')();

function questionnaireService() {
    function createQuestionnaire() {
        const opts = {
            url: `http://some-url.com`,
            body: {
                data: "some-data"
            }
        };
        return service.post(opts);
    }

    return Object.freeze({
        createQuestionnaire
    });
}

module.exports = questionnaireService;

request-service.js

const got = require('got');
const merge = require('lodash.merge');

function requestService() {
    function post(options) {
        let opts = {
            method: 'POST',
            headers: {
                accept: 'application/json',
                'Content-Type': 'application/json'
            },
            json: true,
            body: options.body
        };
        opts = merge(opts, options);
        return got(opts.url, opts);
    }

    return Object.freeze({
        post
    });
}

module.exports = requestService;

我正在尝试为问卷服务编写测试,并想模拟“发布”功能。我已经尝试了以下

questionnaire-service.test.js

const requestService = require('./request-service')();
const questionnaireService = require('./questionnaire-service')();
const createdQuestionnaire = require('./test-fixtures/res/get_questionnaire.json');

describe('questionnaire service routes', () => {
    it('Should create a new questionnaire', async () => {
        const spy = jest.spyOn(requestService.post);
        spy.mockReturnValue(createdQuestionnaire);

        const response = await questionnaireService.createQuestionnaire();

        expect(requestService.post).toBeCalled();
        expect(response).toMatch(createdQuestionnaire);
    }

    it('Should create a new questionnaire', async () => {
        jest.doMock('./questionnaire-service', () =>
            jest.fn(() => ({
                createQuestionnaire: () => createdQuestionnaire
            }))
        );

        const response = await questionnaireService.createQuestionnaire();

        expect(questionnaireService.createQuestionnaire).toBeCalled();
        expect(response).toMatch(createdQuestionnaire);
    }

    it('Should create a new questionnaire', async () => {
        jest.doMock('./request-service', () =>
            jest.fn(() => ({
                post: () => createdQuestionnaire
            }))
        );

        const response = await questionnaireService.createQuestionnaire();

        expect(requestService.post).toBeCalled();
        expect(response).toMatch(createdQuestionnaire);
    }
});

以上所有内容都会产生相同的错误:RequestError: getaddrinfo ENOTFOUND some_token some_token:443,这听起来像是由“GOT”模块抛出的,没有找到要点击的网址。有人可以阐明如何使其正常工作吗?

【问题讨论】:

    标签: node.js mocking jestjs


    【解决方案1】:

    当您创建require("somemodule") 时,它会加载此模块并执行它,因此它会在此模块内执行require 调用。然后所有的模块都被缓存了,所以每当你再次创建require 时,它不会再次执行,而是返回已经缓存的依赖项。

    当您执行doMock 时,您需要重置此缓存,并在您的测试中为所有内容创建新的require,这取决于模拟模块。

        jest.doMock('./questionnaire-service', () =>
            jest.fn(() => ({
                createQuestionnaire: () => createdQuestionnaire
            }))
        );
        jest.resetModules();
        const questionnaireService = require(`questionnaire-service`)();
    
        const response = await questionnaireService.createQuestionnaire();
    

    【讨论】:

      猜你喜欢
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2018-12-07
      • 1970-01-01
      • 2018-10-23
      • 2018-08-06
      • 1970-01-01
      相关资源
      最近更新 更多