Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jest mock不允许在单个测试中解析内部函数_Javascript_Unit Testing_Jestjs_Google Cloud Functions_Firebase Admin - Fatal编程技术网

Javascript Jest mock不允许在单个测试中解析内部函数

Javascript Jest mock不允许在单个测试中解析内部函数,javascript,unit-testing,jestjs,google-cloud-functions,firebase-admin,Javascript,Unit Testing,Jestjs,Google Cloud Functions,Firebase Admin,我正在我的functions/send.js模块中测试一个名为myCloudFn的云函数。我的测试在functions/test/send.test.js中: //send.js const{getCompareDate}=require('../utils.js'); 异步函数myCloudFn(myTestDate){ const compareDate=等待getCompareDate(argToTest); const isOlder=myTestDate({ getCompareDat

我正在我的
functions/send.js
模块中测试一个名为
myCloudFn
的云函数。我的测试在
functions/test/send.test.js
中:

//send.js
const{getCompareDate}=require('../utils.js');
异步函数myCloudFn(myTestDate){
const compareDate=等待getCompareDate(argToTest);
const isOlder=myTestDate
//send.test.js
const send=require('../send.js');
jest.mock('../utils',()=>({
getCompareDate:jest.fn(()=>newdate('2020-01-31'))//默认值
.mockResolvedValue一次(新日期('2020-04-04'))
.mockResolvedValueOnce(新日期('2020-02-02')),
}));
描述('send.js',()=>{
它('从myCloudFn()返回日期比较',异步()=>{
const myTestDate='2020-03-03';
const returnValues=['older','newer'];
const responsePromises=returnValues.map(()=>send.myCloudFn(myTestDate));
const responses=wait Promise.all(responsePromises);
expect(响应[0])。toBe(返回值[0]);
expect(响应[1])toBe(返回值[1]);
});
});
当我以这种方式模拟
getCompareDate
时,测试正常运行并按预期通过,但为了灵活性,我宁愿在测试中为
getCompareDate
提供自定义输入值,而不是“全局”。以下是我尝试过的:

const mockGetCompareDate=jest.fn();
jest.mock('../utils',()=>({
getCompareDate:mockGetCompareDate,
}));
it('从myCloudFn()返回日期比较',async()=>{
模拟比较
.mockResolvedValue一次(新日期('2020-04-04'))
.mockResolvedValue一次(新日期('2020-02-02');
const myTestDate='2020-03-03';
const returnValues=['older','newer'];
const responsePromises=returnValues.map(()=>send.myCloudFn(myTestDate));
const responses=wait Promise.all(responsePromises);
expect(响应[0])。toBe(返回值[0]);
expect(响应[1])toBe(返回值[1]);
});
但是,此方法不起作用,并引发错误:
ReferenceError:无法在初始化之前访问“mockGetCompareDate”

我已经在解决方案中提到的其他测试中使用了这种方法,但是我在这里没有看到类似的结果。我遗漏了什么?

Jest将模拟函数提升到模块顶部,因此抛出此错误。应该在运行测试之前使用mock

试试这个:

const { getCompareDate } = require('../utils.js');

const mockGetCompareDate = jest.fn(() => new Date('2020-01-31'));

jest.mock('../utils.js', () => ({
  __esModule: true,
  getCompareDate: jest.fn(),
  default: jest.fn()
}));

beforeAll(() => {
  getCompareDate.mockImplementation(mockGetCompareDate);
});
要提供自定义值,请在初始化模拟函数时执行与以前相同的操作

像这样:

const mockGetCompareDate = jest.fn()
      .mockResolvedValueOnce(new Date('2020-04-04'))
      .mockResolvedValueOnce(new Date('2020-02-02'));
it('returns date comparison from myCloudFn()', async () => {
    mockGetCompareDate
      .mockResolvedValueOnce(new Date('2020-04-04'))
      .mockResolvedValueOnce(new Date('2020-02-02'));
或者像你之前在测试中做的那样

像这样:

const mockGetCompareDate = jest.fn()
      .mockResolvedValueOnce(new Date('2020-04-04'))
      .mockResolvedValueOnce(new Date('2020-02-02'));
it('returns date comparison from myCloudFn()', async () => {
    mockGetCompareDate
      .mockResolvedValueOnce(new Date('2020-04-04'))
      .mockResolvedValueOnce(new Date('2020-02-02'));

Jest将模拟函数提升到模块顶部,因此抛出此错误。应该在运行测试之前使用mock

试试这个:

const { getCompareDate } = require('../utils.js');

const mockGetCompareDate = jest.fn(() => new Date('2020-01-31'));

jest.mock('../utils.js', () => ({
  __esModule: true,
  getCompareDate: jest.fn(),
  default: jest.fn()
}));

beforeAll(() => {
  getCompareDate.mockImplementation(mockGetCompareDate);
});
要提供自定义值,请在初始化模拟函数时执行与以前相同的操作

像这样:

const mockGetCompareDate = jest.fn()
      .mockResolvedValueOnce(new Date('2020-04-04'))
      .mockResolvedValueOnce(new Date('2020-02-02'));
it('returns date comparison from myCloudFn()', async () => {
    mockGetCompareDate
      .mockResolvedValueOnce(new Date('2020-04-04'))
      .mockResolvedValueOnce(new Date('2020-02-02'));
或者像你之前在测试中做的那样

像这样:

const mockGetCompareDate = jest.fn()
      .mockResolvedValueOnce(new Date('2020-04-04'))
      .mockResolvedValueOnce(new Date('2020-02-02'));
it('returns date comparison from myCloudFn()', async () => {
    mockGetCompareDate
      .mockResolvedValueOnce(new Date('2020-04-04'))
      .mockResolvedValueOnce(new Date('2020-02-02'));

谢谢,但是如何在测试中为
getCompareDate
提供自定义输入值呢?这很有帮助,谢谢。现在一切都好了。为了让它工作,我必须做两个更改:1)将
namedExport
更改为
getCompareDate
,2)将
mockGetCompareDate
定义编辑为
jest.fn(()=>新日期('2020-01-31')以前的错误(如果不存在);如果我在测试中没有提供特定的东西,后者会恢复默认值功能。这太好了,很高兴它有帮助。谢谢你的更新。学到了一些新东西。谢谢,但是我如何在测试中为
getCompareDate
提供自定义输入值呢?这很有帮助,谢谢。现在一切都好了。为了让它工作,我必须做两个更改:1)将
namedExport
更改为
getCompareDate
,2)将
mockGetCompareDate
定义编辑为
jest.fn(()=>新日期('2020-01-31')以前的错误(如果不存在);如果我在测试中没有提供特定的东西,后者会恢复默认值功能。这太好了,很高兴它有帮助。谢谢你的更新。我学到了一些新东西。