当前位置: 首页 > 面试题库 >

使用Jest嘲笑的服务导致“不允许jest.mock()的模块工厂引用任何范围外的变量”错误

胡璞瑜
2023-03-14
问题内容

我正在尝试模拟对服务的调用,但是我在以下消息中苦苦挣扎: 的模块工厂jest.mock()不允许引用任何范围外的变量

我正在使用带有ES6语法,笑话和酶的babel。

我有一个称为的简单组件Vocabulary,该组件从中获取VocabularyEntry-Objects
的列表vocabularyService并进行渲染。

import React from 'react';
import vocabularyService from '../services/vocabularyService';

export default class Vocabulary extends React.Component {

render() {

    let rows = vocabularyService.vocabulary.map((v, i) => <tr key={i}>
            <td>{v.src}</td>
            <td>{v.target}</td>
        </tr>
    );
    // render rows
 }
 }

vocabularyServiseIST很简单:

  import {VocabularyEntry} from '../model/VocabularyEntry';

  class VocabularyService {

  constructor() {
       this.vocabulary = [new VocabularyEntry("a", "b")];
  }
} 
export default new VocabularyService();`

现在我想vocabularyService在测试中模拟:

import {shallow} from 'enzyme';
import React from 'react';
import Vocabulary from "../../../src/components/Vocabulary ";
import {VocabularyEntry} from '../../../src/model/VocabularyEntry'

jest.mock('../../../src/services/vocabularyService', () => ({

vocabulary: [new VocabularyEntry("a", "a1")]

}));

describe("Vocabulary tests", () => {

test("renders the vocabulary", () => {

    let $component = shallow(<Vocabulary/>);

    // expect something

});

});

运行测试会导致错误:Vocabulary.spec.js:babel-plugin-jest-
hoist:的模块工厂jest.mock()不允许引用任何范围外的变量。无效的变量访问:VocabularyEntry。

据我所知,我无法使用VocabularyEntry,因为它没有声明(因为开玩笑将模拟定义移到了文件的顶部)。

谁能解释我该如何解决?我看到了需要在模拟调用中引用这些引用的解决方案,但是我不明白如何使用类文件来实现。


问题答案:

问题在于,所有这些都jest.mock将在编译时提升到实际代码块的顶部,在这种情况下,这就是文件的顶部。此时VocabularyEntry尚未导入。你既可以把mock一个beforeAll在测试或使用块jest.mock这样的:

import {shallow} from 'enzyme';
import React from 'react';
import Vocabulary from "../../../src/components/Vocabulary ";
import {VocabularyEntry} from '../../../src/model/VocabularyEntry'
import vocabularyService from '../../../src/services/vocabularyService'

jest.mock('../../../src/services/vocabularyService', () => jest.fn())

vocabularyService.mockImplementation(() => ({
  vocabulary: [new VocabularyEntry("a", "a1")]
}))

这将首先使用一个简单的间谍对模块进行模拟,并在所有内容导入后设置模拟的实际实现。



 类似资料:
  • 假设我的OpenAPI定义有两个服务器。两者共享相同的变量。因此,我想引用这些变量来防止重复代码。 是否可以引用服务器变量或以另一种方式重用它们? 当然,我可以运行,但我不想使用它。

  • 我在spock框架测试方面是非常新的,我没有找到任何可以找到所需信息的例子。因此,我认为最好的方法是向一个例子展示我需要拥有的东西。 > 例如。斯波克的测试类: 将数据作为域类: 现在我有了测试,并且想模拟唯一的方法。这意味着每次调用时,都需要有msg成功的对象数据,但是方法中的所有其他方法都应该正常调用。 很可以理解吗?问题是如何将服务类注入/模拟到spock测试类中?

  • 在大多数编程语言中,变量的生命周期是“定义此变量的块(block)”。 但是在 JavaScript 中,变量的作用域却和函数息息相关,而不是大括号: function func(x) { console.log(tmp); // undefined if (x < 0) { var tmp = 100 - x; // (*) ... }

  • 问题内容: 这将编译 这不会 我希望两者都能编译(也许这是C的工作方式?)。是什么原因导致无法在外部块中以相同的名称声明一个块中的变量? 问题答案: 简短的答案是:因为这是JLS§6.4中定义Java语言的方式。 您可能从其他语言中使用过,因此允许使用所谓的可变阴影。但是,Java语言的发明者认为这是一个笨拙的功能,他们不希望使用其语言: 此限制有助于检测其他一些非常模糊的错误。 但是,正如作者在

  • 我有一个React应用程序(不使用createreact应用程序),它是使用TypeScript、Jest、Webpack和Babel构建的。当尝试运行“纱线玩笑”时,我得到以下错误: 我已经尝试删除所有软件包并重新添加它们。它没有解决这个问题。我已经看了类似的问题和留档,仍然误解了一些东西。我甚至按照另一个指南从头开始设置这个环境,并且仍然用我的代码收到了这个问题。 依赖项包括。。。 组件的导入

  • 我目前正在做一个小项目,作为Java测试课程的实习,我们试图看看mocking是如何工作的。 我们的目标是看到我们可以忽略我们所嘲笑的类中的错误。 正如您在Collaborateur中看到的,缺少一个“;”在System.Out之后,exercice的目标是表明嘲笑这个类可以让我们忽略这个错误。我的一些同事使用Eclipse时,使用“以JUnit形式运行”功能没有问题。 在Intellij中,我没