如何监视组件外部的功能?

时间:2019-04-24 03:34:18

标签: jestjs enzyme

// ./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.

的消息

在这种情况下,我不想使用模仿()方法代替spyOn()。

有办法解决吗?谢谢您的阅读。 :D

1 个答案:

答案 0 :(得分:1)

它不起作用,因为此行:

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

...正在模块导出上为func ...

创建间谍

...但是,Test.do不会为func调用模块导出,而是直接调用func


有两种解决方法。

一种方法是将func移到其自己的模块中。

然后将模块导出导入到index.js中,并在Test.do中调用...

...并且func模块导出被包裹在间谍中时,间谍将被Test.do调用。


另一个选择是注意"ES6 modules support cyclic dependencies automatically",以便可以将模块导入自身。

如果将模块导入自身,则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!
  });
});