如何用玩笑解开单个实例方法

时间:2019-01-09 12:02:37

标签: ecmascript-6 mocking jestjs es6-class

来自rspec,我很难理解开玩笑的嘲笑。我正在尝试的方法是,自动模拟类的构造函数及其所有功能,然后逐个取消模拟它们,以仅测试该功能。我唯一可以找到的文档是使用2个类,模拟1个类,然后测试是否从另一个未模拟的类调用了这些函数。

以下是我尝试做的一个基本的,虚构的想法。有人可以指引我开玩笑吗?

foo.js

class Foo
  constructor: ->
    this.bar()
    this.baz()
  bar: ->
    return 'bar'
  baz: ->
    return 'baz'

foo_test.js

// require the class
Foo = require('foo')

// mock entire Foo class methods
jest.mock('foo')

// unmock just the bar method
jest.unmock(Foo::bar)

// or by
Foo::bar.mockRestore()

// and should now be able to call
foo = new Foo
foo.bar() // 'bar'
foo.baz() // undefined (still mocked)

// i even tried unmocking the instance
foo = new Foo
jest.unmock(foo.bar)
foo.bar.mockRestore()

4 个答案:

答案 0 :(得分:7)

mockFn.mockRestore()jest@24.9.0一起为我工作:

// Create a spy with a mock
const consoleInfoSpy = jest.spyOn(console, 'info').mockImplementation(() => {})

// Run test or whatever code which uses console.info
console.info('This bypasses the real console.info')

// Restore original console.info
consoleInfoSpy.mockRestore()

答案 1 :(得分:2)

在Jest中对原始模块进行模拟后,无法获得原始模块。 jest.mock的作用是用模拟替换模块。

所以即使您写:

Foo = require('foo')
jest.mock('foo')

Jest将把jest.mock('foo')调用提升到调用堆栈的顶部,因此这是测试开始时发生的第一件事。这也会影响您导入的所有其他模块以及导入的foo.js

您可以尝试使用spyOn监视对象的功能,也应该使用类,但是我不太确定。

答案 2 :(得分:0)

这并不严格适用于OP,但是寻求解答者可能会在这里结束。您可以像这样对所有测试的某些部分进行模拟,除了某些部分。

__ mocks __ / saladMaker.js

// Let Jest create the mock.
const saladMaker = jest.genMockFromModule('../saladMaker');

// Get the unmocked chop method.
const {chop} = require.requireActual('../saladMaker');

// Patch it in.
saladMaker.chop = chop;

module.exports = saladMaker;

关键部分是使用requireActual进入未经模拟的模块。

bypassing module mocks

答案 3 :(得分:0)

我尝试了很多事情,但是最终对我有用的是(使用Create React App):

setupTests.ts

jest.mock("./services/translations/translationsService", () => ({
  __esModule: true,
  default: {
    initDict: (): void => undefined,
    translate: (key: Phrases): string => key,
  },
  t: (key: Phrases): string => key,
}));

模拟所有测试模块。为了模拟一个测试套件,我做了:

jest.mock("../../../services/translations/translationsService", () =>
  jest.requireActual("../../../services/translations/translationsService")
);

describe(() => { /* test suite goes here and uses real implementation */ });