Как шпионить за функциями за пределами компонента? - PullRequest
1 голос
/ 24 апреля 2019
// ./index.js
import { Component } from 'react';

export default class Test extends Component {
    method () {
        console.log('method()');
    }

    do () {
        this.method();
        func();
    }

    render () {
        return null;
    }
}

export function func () {
    console.log('func()');
}

// ./index.test.js
import { shallow } from 'enzyme';
import React from 'react';
import * as Test from './index';

describe('<Test>', () => {
    const component = shallow(<Test.default/>),
          method_spy = jest.spyOn(component.instance(), 'method'),
          func_spy = jest.spyOn(Test, 'func');

    test('func()', () => {
        component.instance().do();
        expect(method_spy).toHaveBeenCalledTimes(1); // passed
        expect(func_spy).toHaveBeenCalledTimes(1); // failed
    });
});

Я хочу шпионить за функцией вне компонента, но она не работает.

У меня есть сообщение типа Expected mock function to have been called one time, but it was called zero times.

И я не хочу использовать метод mock () вместо spyOn () в ситуации.

Есть ли способ это исправить? Спасибо за чтение. : D

1 Ответ

1 голос
/ 24 апреля 2019

Не работает, потому что эта строка:

const func_spy = jest.spyOn(Test, 'func');

... создает шпион для экспорта модуля для func ...

... но Test.do не вызывает экспорт модуля для func, он вызывает func напрямую.


Есть два варианта исправить это.

Нужно переместить func в свой собственный модуль.

Затем модуль экспорта для него будет импортирован в index.js и вызван в Test.do ...

... и когда экспорт модуля для func обернут в шпиона, шпион будет вызван Test.do.


Другой вариант - отметить, что «Модули ES6 поддерживают циклические зависимости автоматически» , поэтому модуль можно импортировать в себя.

Если модуль импортируется в себя, то Test.do может вызвать экспорт модуля для func:

import { Component } from 'react';
import * as index from './index';  // <= import the module into itself

export default class Test extends Component {
  method() {
    console.log('method()');
  }

  do() {
    this.method();
    index.func();  // <= use the module
  }

  render() {
    return null;
  }
}

export function func() {
  console.log('func()');
}

... и шпион при экспорте модуля для func будет вызван, как и ожидалось:

import { shallow } from 'enzyme';
import React from 'react';
import * as Test from './index';

describe('<Test>', () => {
  const component = shallow(<Test.default />),
    method_spy = jest.spyOn(component.instance(), 'method'),
    func_spy = jest.spyOn(Test, 'func');

  test('func()', () => {
    component.instance().do();
    expect(method_spy).toHaveBeenCalledTimes(1);  // Success!
    expect(func_spy).toHaveBeenCalledTimes(1);  // Success!
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...