Jest - имитация отдельной функции из класса es6

Я хотел бы проверить, вызывается ли конкретная функция из функции, которую я тестирую, однако обе эти функции находятся в классе es6, который я тестирую.

Настраивать:

// MyClass.js

export default class MyClass {
   constructor () { ... }
   foo() {
      ...
      bar()
   }
   bar() { 
      ... 
   }
}

Итак, я тестирую foo (), но в рамках своего теста я хочу убедиться, что вызывается bar (). Я вижу, как я могу это сделать, если bar () была внешней зависимостью, так как я мог бы просто высмеять это, но поскольку это часть тестируемого класса, я не могу издеваться над всем классом, иначе я бы не стал называть конкретную реализацию в моем тесте.

Я надеялся, что это поможет (согласно https://facebook.github.io/jest/docs/en/es6-class-mocks.html), но безрезультатно:

// MyClass.spec.js

jest.unmock('./MyClass')
import MyClass from './MyClass'  
...
test('my test', () => {
   var mockBar = jest.fn()
   MyClass.bar = mockBar   

   var myClass = new MyClass()
   myClass.foo()

   expect(mockBar).toHaveBeenCalled()
})

Я также попытался издеваться над методом в созданной версии MyClass (т.е. myClass.bar = mockBar), но ни один из них не дал желаемых результатов.

Возможна ли эта насмешливая структура с помощью шутки?


person Bauza23    schedule 04.04.2018    source источник


Ответы (1)


При тестировании конкретного метода класса ES6 (не экземпляра класса) вы должны имитировать не свойство класса, а свойство этого класса прототип.

jest.unmock('./MyClass')
import MyClass from './MyClass'  
...
test('my test', () => {
  var mockBar = jest.fn()
  MyClass.prototype.bar = mockBar // here's the difference   

  var myClass = new MyClass()
  myClass.foo()

  expect(mockBar).toHaveBeenCalled()
})

Это потому, что классы ES6 - это просто сахар по сравнению с простой моделью прототипа Javascript, и

class MyClass {
  bar() {}
}

эквивалентно не

var MyClass = function () {
  MyClass.bar = function bar() {};

  return MyClass;
}();

но

var MyClass = function () {
  MyClass.prototype.bar = function bar() {};

  return MyClass;
}();
person Andrew Miroshnichenko    schedule 05.04.2018