Jest.fn-使用jest.mock时返回的值返回未定义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jest.fn-使用jest.mock时返回的值返回未定义相关的知识,希望对你有一定的参考价值。

我有以下文件正在尝试为其编写单元测试:

import  document  from '../../globals';
const Overlay = () => 
  console.log(document.getElementsByTagName()); // this outputs 'undefined'
;

我正在努力模拟getElementsByTagName函数。我的测试看起来像这样。

import  document  from '../../globals';
jest.mock('../../globals', () => (
  document: 
    getElementsByTagName: jest.fn().mockReturnValue('foo')
  
));
console.log(document.getElementsByTagName()); // this outputs 'foo'

但是不幸的是,头文件中的console.log始终输出undefined。它可以看到文档对象和getElementsByTagName模拟,但返回值始终为undefined

如果我console.log(document.getElementsByTagName),我得到以下信息:

 getElementsByTagName:
    [Function: mockConstructor]
     _isMockFunction: true,
     getMockImplementation: [Function],
     mock: [Getter/Setter],
     mockClear: [Function],
     mockReset: [Function],
     mockReturnValueOnce: [Function],
     mockReturnValue: [Function],
     mockImplementationOnce: [Function],
     mockImplementation: [Function],
     mockReturnThis: [Function],
     mockRestore: [Function] ,

但是如果我在另一个文件中做同样的事情,我会得到这个:

function () 
  return fn.apply(this, arguments);

我怀疑jest.mock正在将jest.fn模拟包装在另一个函数中。。有什么想法吗?

答案

它对我有用。

例如

index.ts

import  document  from './globals';

export const Overlay = () => 
  console.log(document.getElementsByTagName());
;

globals.ts

export const document = 
  getElementsByTagName() 
    return 'real element';
  ,
;

index.test.ts

import  Overlay  from './';

jest.mock('./globals', () => (
  document: 
    getElementsByTagName: jest.fn().mockReturnValue('foo'),
  ,
));

describe('46431638', () => 
  it('should mock and pass', () => 
    jest.spyOn(console, 'log');
    Overlay();
    expect(console.log).toBeCalledWith('foo');
  );
);

带有覆盖率报告的单元测试结果:

 PASS  src/stackoverflow/46431638/index.test.ts
  46431638
    ✓ should mock and pass (24ms)

  console.log node_modules/jest-mock/build/index.js:860
    foo

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.ts |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        6.601s, estimated 13s

源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/46431638

以上是关于Jest.fn-使用jest.mock时返回的值返回未定义的主要内容,如果未能解决你的问题,请参考以下文章

jest中的mock,jest.fn()jest.spyOn()jest.mock()

jest中的mock,jest.fn()jest.spyOn()jest.mock()

jest中的mock,jest.fn()jest.spyOn()jest.mock()

每次测试都是Mock模块

2w字的超级大文:自动化测试入门

ES6类开玩笑嘲弄