как снять шутку с одного экземпляра метода - PullRequest
0 голосов
/ 09 января 2019

из 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()

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Это не относится строго к ФП, но ищущие ответы могут оказаться здесь. Вы можете смоделировать модуль, за исключением определенных частей, для всех тестов следующим образом.

__ издевается __ / 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 для доступа к немодулированному модулю.

обход модуля модуля

0 голосов
/ 09 января 2019

Невозможно получить оригинальный модуль после насмешки над ним в Jest. jest.mock делает замену модуля на ваш макет.

Так что даже ты пишешь:

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

Jest поднимет вызов jest.mock('foo') поверх стека вызовов, так что это первое, что происходит при запуске теста. Это также повлияет на все другие модули, которые вы импортируете и которые импортируют foo.js.

Вы можете попытаться использовать spyOn для слежки за функциями объекта, должны также работать с классами, но я не совсем уверен.

...