当前位置: 首页 > 面试题库 >

开玩笑的spyOn函数称为

柳景胜
2023-03-14
问题内容

我正在尝试为一个简单的React组件编写一个简单的测试,并且我想使用Jest来确认我用酶模拟点击时已调用了一个函数。根据Jest文档,我应该能够使用spyOn它:spyOn。

但是,当我尝试此操作时,我不断得到TypeError: Cannot read property '_isMockFunction' of undefined暗示我的间谍未定义的信息。我的代码如下所示:

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
class App extends Component {

  myClickFunc = () => {
      console.log('clickity clickcty')
  }
  render() {
    return (
      <div className="App">
        <div className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h2>Welcome to React</h2>
        </div>
        <p className="App-intro" onClick={this.myClickFunc}>
          To get started, edit <code>src/App.js</code> and save to reload.
        </p>
      </div>
    );
  }
}

export default App;

在我的测试文件中:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { shallow, mount, render } from 'enzyme'

describe('my sweet test', () => {
 it('clicks it', () => {
    const spy = jest.spyOn(App, 'myClickFunc')
    const app = shallow(<App />)
    const p = app.find('.App-intro')
    p.simulate('click')
    expect(spy).toHaveBeenCalled()
 })
})

有人了解我在做什么错吗?


问题答案:

嗨,伙计,我知道我来晚了,但是除了您的方式之外,您几乎已经完成,没有任何改变spyOn。当您使用的间谍,你有两个选择:spyOnApp.prototype或组件component.instance()

const spy = jest.spyOn(Class.prototype,“ method”)

将间谍附加到类原型上并渲染(浅渲染)实例的顺序很重要。

const spy = jest.spyOn(App.prototype, "myClickFn");
const instance = shallow(<App />);

App.prototype第一行位有你需要的东西,使事情的工作。在class您使用实例化javascript new MyClass()或将其浸入之前,javascript
没有任何方法MyClass.prototype。对于您的特定问题,您只需监视该App.prototype方法myClickFn

jest.spyOn(component.instance(),“方法”)

const component = shallow(<App />);
const spy = jest.spyOn(component.instance(), "myClickFn");

此方法要求a的shallow/render/mount实例React.Component可用。本质上spyOn就是在寻找可以劫持并推向市场的东西jest.fn()。它可能是:

平原object

const obj = {a: x => (true)};
const spy = jest.spyOn(obj, "a");

class

class Foo {
    bar() {}
}

const nope = jest.spyOn(Foo, "bar");
// THROWS ERROR. Foo has no "bar" method.
// Only an instance of Foo has "bar".
const fooSpy = jest.spyOn(Foo.prototype, "bar");
// Any call to "bar" will trigger this spy; prototype or instance

const fooInstance = new Foo();
const fooInstanceSpy = jest.spyOn(fooInstance, "bar");
// Any call fooInstance makes to "bar" will trigger this spy.

或一个React.Component instance

const component = shallow(<App />);
/*
component.instance()
-> {myClickFn: f(), render: f(), ...etc}
*/
const spy = jest.spyOn(component.instance(), "myClickFn");

或一个React.Component.prototype

/*
App.prototype
-> {myClickFn: f(), render: f(), ...etc}
*/
const spy = jest.spyOn(App.prototype, "myClickFn");
// Any call to "myClickFn" from any instance of App will trigger this spy.

我已经使用并看到了两种方法。当我有一个beforeEach()beforeAll()块时,我可能会采用第一种方法。如果我只需要快速监视,我将使用第二个。只需注意附加间谍的顺序即可。

编辑:如果要检查您的副作用,您myClickFn可以在单独的测试中调用它。

const app = shallow(<App />);
app.instance().myClickFn()
/*
Now assert your function does what it is supposed to do...
eg.
expect(app.state("foo")).toEqual("bar");
*/


 类似资料:
  • 我有下面的打字稿类,我想测试在笑话。 这是我的测试: 如何模拟MyClass中使用的foo函数,以使测试通过?

  • 问题内容: 这是我的第一个前端测试经验。在这个项目中,我正在使用jest快照测试,并且组件内部出现错误。 我浏览了一些有趣的文档,发现“手动模拟”部分,但是我还不知道该如何做。 问题答案: 开玩笑的文档现在有一个“官方”解决方法: JSDOM中未实现的模拟方法

  • 我创建了这个类: 在服务中: 我想知道,在开玩笑的情况下,是否可以这样做:

  • 问题内容: Jest提供了一种模拟函数的方法,如其文档中所述 但是,这些模拟仅在直接在测试中调用函数时才起作用。 如果我有一个这样定义的React Component,该如何模拟呢? 我不知道如何制作它,所以组件调用了我的模拟实现,以便我可以测试它是否可以正确地呈现数据。 (这是一个简化的,人为的示例,目的是为了了解如何模拟在React组件内部调用的函数) 编辑:api.js文件,为清楚起见 问题

  • 问题内容: 首先,我是和的新手。 我有一个实例化的类,我想测试一下。 这是我的代码: 我想测试一下我的功能。我的头,我认为测试fs.existsSync的状态是个好主意。如果返回,则必须调用。所以我尝试写一些测试: 但是,我有一个错误: 您能帮我调试和测试我的功能吗? 问候。 问题答案: 出现错误是因为它正在寻找在您的对象上调用的方法,该方法不存在。如果您可以访问测试中的模块,则可以监视如下方法:

  • 问题内容: 我想嘲笑localStorage方法以进行错误模拟。我在Utility.js中定义了localstorage getter和setter方法。我想嘲笑在调用时抛出错误。 开玩笑, 但是模拟永远不会被调用。我也尝试过 问题答案: 这与Andreas在答案中建议的一致,但是我能够使用Storage接口对其进行模拟。我做了这样的事情 开玩笑, 这次公关讨论也很有帮助。