【问题标题】:why jest mocked function doesnt return anything?为什么开玩笑的模拟函数不返回任何东西?
【发布时间】:2021-09-18 07:07:47
【问题描述】:

我要测试的代码是

    'use strict';

const FastestValidator = require("fastest-validator");
const { selector } = require("../selector");

/**
 * @param {object} data - Request Body object
 * @return {object} - Valiated results after applying the Schema
 *
 **/

const validator = async (data) => {
  try {
    console.log("FastestValidator>>  ",FastestValidator)
    console.log("selector>>  ",selector)
    const v = new FastestValidator();
    let schema = await selector(data);
    console.log("schema>>  ",schema)
    console.log("v>>  ",v)
    let check = v.compile(schema);
    let inBoundMappedSchema = {};
    let validatingInboundData = {};


    for (let index in schema) {
      inBoundMappedSchema[index] = data[index];
    }
    validatingInboundData = await check(inBoundMappedSchema);
    if (typeof validatingInboundData === 'object') {
      return {
        success: false,
        potentialIssue: validatingInboundData
      }
    } else if (validatingInboundData && typeof boolean) {
      return {
        success: true,
      }
    }
  } catch (err) {
    console.log("error>>", err)
    return {
      success: false,
      errorMessage: err
    }
  }

};

module.exports = {
  validator
};

我的测试用例是..

    const {validator} = require('./index');

let FastestValidator = require("fastest-validator");
let { selector } = require("../selector");
jest.mock('../selector');
jest.mock('fastest-validator');






test('testing schema validator', async () => {
  let failed = {
    success: false,
    
  }
  let data = {
      message: 'you '
  }
  
  
  console.log("selector",selector)
  selector = jest.fn();
  selector.mockReturnValueOnce(data);

  selector.mockResolvedValue("randomPrivateKey")
  

  

  console.log("FastestValidator",FastestValidator)
  console.log("selector",selector)
  


  console.log("FastestValidator",validator.FastestValidator)
  console.log("selector",validator.selector)
  

  

    
      
    
    await expect(validator(data)).resolves.toEqual(failed);
  });

在调试日志中,我可以看到 schema>> 是 undefined ,我希望它是 data 或 randomprivateKey 。 如果我知道如何模拟使用 new 关键字创建的对象,我会非常有帮助,因为我正在使用 new FastestValidator() 创建对象,并且我还需要模拟它的所有方法。

添加控制台输出:

    FAIL  src/api/schema/validator/index.test.js
  ● Console

    console.log
      selector [Function: selector] {
        _isMockFunction: true,
        getMockImplementation: [Function (anonymous)],
        mock: [Getter/Setter],
        mockClear: [Function (anonymous)],
        mockReset: [Function (anonymous)],
        mockRestore: [Function (anonymous)],
        mockReturnValueOnce: [Function (anonymous)],
        mockResolvedValueOnce: [Function (anonymous)],
        mockRejectedValueOnce: [Function (anonymous)],
        mockReturnValue: [Function (anonymous)],
        mockResolvedValue: [Function (anonymous)],
        mockRejectedValue: [Function (anonymous)],
        mockImplementationOnce: [Function (anonymous)],
        mockImplementation: [Function (anonymous)],
        mockReturnThis: [Function (anonymous)],
        mockName: [Function (anonymous)],
        getMockName: [Function (anonymous)],
        constructor: [Function: AsyncFunction] {
          _isMockFunction: true,
          getMockImplementation: [Function (anonymous)],
          mock: [Getter/Setter],
          mockClear: [Function (anonymous)],
          mockReset: [Function (anonymous)],
          mockRestore: [Function (anonymous)],
          mockReturnValueOnce: [Function (anonymous)],
          mockResolvedValueOnce: [Function (anonymous)],
          mockRejectedValueOnce: [Function (anonymous)],
          mockReturnValue: [Function (anonymous)],
          mockResolvedValue: [Function (anonymous)],
          mockRejectedValue: [Function (anonymous)],
          mockImplementationOnce: [Function (anonymous)],
          mockImplementation: [Function (anonymous)],
          mockReturnThis: [Function (anonymous)],
          mockName: [Function (anonymous)],
          getMockName: [Function (anonymous)]
        }
      }

      at Object.<anonymous> (src/api/schema/validator/index.test.js:23:11)

    console.log
      FastestValidator [Function: Validator] {
        _isMockFunction: true,
        getMockImplementation: [Function (anonymous)],
        mock: [Getter/Setter],
        mockClear: [Function (anonymous)],
        mockReset: [Function (anonymous)],
        mockRestore: [Function (anonymous)],
        mockReturnValueOnce: [Function (anonymous)],
        mockResolvedValueOnce: [Function (anonymous)],
        mockRejectedValueOnce: [Function (anonymous)],
        mockReturnValue: [Function (anonymous)],
        mockResolvedValue: [Function (anonymous)],
        mockRejectedValue: [Function (anonymous)],
        mockImplementationOnce: [Function (anonymous)],
        mockImplementation: [Function (anonymous)],
        mockReturnThis: [Function (anonymous)],
        mockName: [Function (anonymous)],
        getMockName: [Function (anonymous)]
      }

      at Object.<anonymous> (src/api/schema/validator/index.test.js:32:11)

    console.log
      selector [Function: mockConstructor] {
        _isMockFunction: true,
        getMockImplementation: [Function (anonymous)],
        mock: [Getter/Setter],
        mockClear: [Function (anonymous)],
        mockReset: [Function (anonymous)],
        mockRestore: [Function (anonymous)],
        mockReturnValueOnce: [Function (anonymous)],
        mockResolvedValueOnce: [Function (anonymous)],
        mockRejectedValueOnce: [Function (anonymous)],
        mockReturnValue: [Function (anonymous)],
        mockResolvedValue: [Function (anonymous)],
        mockRejectedValue: [Function (anonymous)],
        mockImplementationOnce: [Function (anonymous)],
        mockImplementation: [Function (anonymous)],
        mockReturnThis: [Function (anonymous)],
        mockName: [Function (anonymous)],
        getMockName: [Function (anonymous)]
      }

      at Object.<anonymous> (src/api/schema/validator/index.test.js:33:11)

    console.log
      FastestValidator undefined

      at Object.<anonymous> (src/api/schema/validator/index.test.js:37:11)

    console.log
      selector undefined

      at Object.<anonymous> (src/api/schema/validator/index.test.js:38:11)

    console.log
      FastestValidator>>   [Function: Validator] {
        _isMockFunction: true,
        getMockImplementation: [Function (anonymous)],
        mock: [Getter/Setter],
        mockClear: [Function (anonymous)],
        mockReset: [Function (anonymous)],
        mockRestore: [Function (anonymous)],
        mockReturnValueOnce: [Function (anonymous)],
        mockResolvedValueOnce: [Function (anonymous)],
        mockRejectedValueOnce: [Function (anonymous)],
        mockReturnValue: [Function (anonymous)],
        mockResolvedValue: [Function (anonymous)],
        mockRejectedValue: [Function (anonymous)],
        mockImplementationOnce: [Function (anonymous)],
        mockImplementation: [Function (anonymous)],
        mockReturnThis: [Function (anonymous)],
        mockName: [Function (anonymous)],
        getMockName: [Function (anonymous)]
      }

      at validator (src/api/schema/validator/index.js:14:13)

    console.log
      selector>>   [Function: selector] {
        _isMockFunction: true,
        getMockImplementation: [Function (anonymous)],
        mock: [Getter/Setter],
        mockClear: [Function (anonymous)],
        mockReset: [Function (anonymous)],
        mockRestore: [Function (anonymous)],
        mockReturnValueOnce: [Function (anonymous)],
        mockResolvedValueOnce: [Function (anonymous)],
        mockRejectedValueOnce: [Function (anonymous)],
        mockReturnValue: [Function (anonymous)],
        mockResolvedValue: [Function (anonymous)],
        mockRejectedValue: [Function (anonymous)],
        mockImplementationOnce: [Function (anonymous)],
        mockImplementation: [Function (anonymous)],
        mockReturnThis: [Function (anonymous)],
        mockName: [Function (anonymous)],
        getMockName: [Function (anonymous)],
        constructor: [Function: AsyncFunction] {
          _isMockFunction: true,
          getMockImplementation: [Function (anonymous)],
          mock: [Getter/Setter],
          mockClear: [Function (anonymous)],
          mockReset: [Function (anonymous)],
          mockRestore: [Function (anonymous)],
          mockReturnValueOnce: [Function (anonymous)],
          mockResolvedValueOnce: [Function (anonymous)],
          mockRejectedValueOnce: [Function (anonymous)],
          mockReturnValue: [Function (anonymous)],
          mockResolvedValue: [Function (anonymous)],
          mockRejectedValue: [Function (anonymous)],
          mockImplementationOnce: [Function (anonymous)],
          mockImplementation: [Function (anonymous)],
          mockReturnThis: [Function (anonymous)],
          mockName: [Function (anonymous)],
          getMockName: [Function (anonymous)]
        }
      }

      at validator (src/api/schema/validator/index.js:15:13)

    console.log
      schema>>   undefined

      at validator (src/api/schema/validator/index.js:18:13)

    console.log
      error>> TypeError: check is not a function
          at validator (/Users/h0j020h/amlng-realtime-api/src/api/schema/validator/index.js:27:35)
          at processTicksAndRejections (internal/process/task_queues.js:95:5)
          at Object.<anonymous> (/Users/h0j020h/amlng-realtime-api/src/api/schema/validator/index.test.js:46:5)

      at validator (src/api/schema/validator/index.js:39:13)

【问题讨论】:

  • 能否包含console.log 语句的输出?

标签: javascript unit-testing jestjs ts-jest


【解决方案1】:

您需要这样模拟compile 方法和selector

const FastestValidator = require("fastest-validator");
const { validator } = require('./validator')
const { selector } = require("../selector");

jest.mock('../selector');
jest.mock('fastest-validator');

const compile = jest.fn();

FastestValidator.mockImplementation(() => ({
  compile
}))

it('testing schema validator', async () => {
  let failed = {
    success: false,
    potentialIssue: {}
  };

  let data = {
      message: 'you ';
  }
  
  selector.mockResolvedValueOnce(data);
  // selector.mockResolvedValue("randomPrivateKey");
  const check = jest.fn();
  compile.mockReturnValue(check);
  check.mockResolvedValue({});
  await expect(validator(data)).resolves.toEqual(failed);
});

原始代码中的主要问题是selector = jest.fn();,为什么?因为您在该行中说现在选择器是一个模拟函数,没有任何绑定到 "../selector" 模块,所以当您调用 validator(data) 时,函数中的选择器是您没有运行的原始模拟模块方法 .mockReturnValueOnce(data).mockResolvedValue("randomPrivateKey"),但您已经在 jest.fn() 指令中运行它们,该指令未绑定到被模拟的模块。

关于“模拟新”,new FastestValidator() 只是创建了一个对象,里面有方法和属性,所以在测试代码中:

FastestValidator.mockImplementation(() => ({
  compile
}))

FastestValidator 返回一个 obj,其中包含一个名为 compile 的方法,该方法是一个模拟的 jest.fn()

【讨论】:

  • 我收到console.log error&gt;&gt; TypeError: check is not a function at validator (/Users/****h/****-api/src/api/schema/validator/index.js:27:35) 你能解释一下我做错了什么以及我必须记住什么规则吗?所以我可以修正我的理解..
  • 更新后也包含该内容
  • 仍然遇到同样的错误。请附上我可以找到详细说明的文件。
  • 忘记包含以下行:compile.mockReturnValue(check);
  • 还加了说明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 2022-10-24
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
相关资源
最近更新 更多