代码之家  ›  专栏  ›  技术社区  ›  Barry Piccinni

嘲笑另一个函数中的函数

  •  0
  • Barry Piccinni  · 技术社区  · 7 年前

    我已经搜索了很多,虽然有很多关于模拟函数的问题被问到,但是我没有找到适合我的设置的解决方案,我也不太确定为什么。我有以下内容:

    问卷调查-服务.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;
    

    请求-服务.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;
    

    我正在尝试为问卷服务编写测试,并希望模拟“post”函数。我试过以下方法

    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”模块抛出的,找不到要命中的url。有人能解释一下如何让它正常工作吗?

    0 回复  |  直到 7 年前
        1
  •  1
  •   iofjuupasli    7 年前

    当你做出一个 require("somemodule") 它加载这个模块并执行它,所以它执行 require 在此模块内调用。然后所有的模块都会被缓存,所以每当你 同样,它不会再次执行,并返回已缓存的依赖项。

    当你这么做的时候 doMock ,您需要重置此缓存,并新建 在所有测试中,这取决于mocked模块。

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