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

标签 javascript unit-testing testing jestjs

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

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模拟另一个功能..有什么想法吗?

最佳答案

尝试使用 .mockReturnValue()分配后
我遇到了同样的行为,并通过调用 mockFn.mockReturnValue(value) 找到了成功分配后。
例如:

import { document } from '../../globals.js'

jest.mock('../../globals.js', () => ({
  document: {
    getElementsByTagName: jest.fn()
  }
}))

document.getElementsByTagName.mockReturnValue('foo')

console.log(document.getElementsByTagName()); // this outputs 'foo'
我在 jest 文档中看到了这两种模式。
  • 见: mockFn.mockReturnValue(value) 显示分配后调用的位置。
  • 见: jest.requireActual(moduleName) 显示分配期间调用的位置。

  • 我想知道后一种情况是否需要其他一些交互模式来断言模拟的返回值,但我还没有弄清楚。我似乎无法使用 spyOn 复制成功图案suggested in another answer here .

    关于javascript - Jest.fn - 使用 jest.mock 时返回值返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46431638/

    相关文章:

    node.js - 使用 Jest 测试框架调用 fetch(url) 时,如何根据 url 模拟变量响应?

    PHPUnit 和抽象类 : how to test concrete constructor that accepts parameters and other concrete methods

    javascript - 有没有一种方法可以整合 jQuery 函数,这些函数在不同的类和 id 上执行相同的操作

    ruby-on-rails - 在 RSpec 3 中断言多个调用的参数

    javascript - 使用 CasperJS 迭代参数化 URL 时仅执行最后一次迭代

    c - 如何测试移植到 64 位的代码(的指针)?

    spring-boot - 从对实际应用程序运行验收测试中获取 jacoco 报告

    json - CakePHP3 集成测试和 json 数据

    javascript - 如何使用循环将字符添加到字符串前?

    javascript - 如何使用 token 而不是 azure 连接字符串进行 blob 存储访问