繁体   English   中英

开玩笑的模拟功能

[英]Mocking functions in Jest

我是JavaScript测试的新手,目前正在尝试为我创建的商店(只是ES6类)编写一些测试用例。 我使用的是Jest,因为这是我们通常用于React项目的内容,尽管这里我不是在测试React组件,而只是在包装一个功能类。

我正在测试的类扩展了另一个类,并在其中定义了各种方法。 我想测试这些方法(是否被调用),以及类中声明的属性是否以及何时调用相应的类方法而进行测试。

现在,我已经阅读了有关模拟函数的信息,但据我了解,它们只能执行检查功能的次数,例如调用函数的次数,但不能复制该功能。 但就我而言,我需要这些方法的功能,因为我将检查这些方法在调用时更改的类成员值。

我不确定这是否是正确的方法。 在没有模拟的情况下在Jest中测试函数是否错误? 并据此推论功能的内部运作? 我们在测试时何时模拟函数?

我面临的问题是我正在处理的项目很大,其中的类/函数具有多个级别的依赖关系,并且很难通过Jest对其进行测试,因为它将需要遍历所有项目。 当我在项目中使用别名作为文件路径时,Jest如果找不到任何模块,则会引发错误。 我知道可以将Webpack与Jest一起使用,但是代码中的许多依赖类/函数不在React中,并且Webpack不维护其别名文件路径。

import { getData } from 'service/common/getData';

class Wrapper extends baseClass {
    someVariable = false;
    payload = null;

    changeVariable() {
        this.someVariable = true;
    }

    async getData() {
        super.start();
        response = await fetchData();
        this.payload = response;
        super.end();
    }
}

这只是我实际代码的一小部分。 我在远程计算机上工作时,无法在此处发布整个课程。 基本上,我想测试是否在调用changeVariable时调用了它,以及是否在调用时成功地将someVariable更改为true 同样,在网络请求完成后检查payload的值。 请注意, fetchData在其他文件中定义,但对于测试getData方法至关重要。 同样,此处用于导入getData的路径( service/common/getData )不是绝对路径,而是Webpack中未定义的别名,而是其他位置。 因此,Jest无法解析getData 如果我模拟getData ,则不必担心这一点,但是我将无法测试其功能。

@maverick完全可以使用jest测试类方法。 检查链接中的代码示例-

https://repl.it/repls/ClumsyCumbersomeAdware

index.js

class Wrapper {
  constructor(){
    this.someVariable = false;
  }
  changeVariable(){
    this.someVariable = true;
  }

  getData(){
    return new Promise(resolve => resolve('some data'));
  }
}


module.exports = Wrapper;

index.test.js

const Wrapper = require('./index');

const wrapper = new Wrapper();

describe('Wrapper tests', () => {
  it('should changeVariable', () => {
    wrapper.changeVariable();
    expect(wrapper.someVariable).toBe(true);
  });

  it('should get some data', () => {
    wrapper.getData().then( res => expect(res).toBe('some data'));
  });
});

这是一个非常简单的示例,在现实生活中,异步调用要复杂得多,并且依赖于第三方库或其他项目模块。 在这种情况下,将所有依赖项注入类,然后分别进行模拟是有意义的。 例如 -

class GMapService {
  constructor(placesApi, directionApi){
      this.placesApi = placesApi;
      this.directionApi = directionApi;
  }

  getPlaceDetails(){
    this.placesApi.getDetails('NYC');
  }

  getDirections(){
    this.directionApi.getDirections('A', 'B');
  }
}

现在,您可以轻松模拟placeApi和directionApi,并单独测试它们,而无需实际需要Google Map依赖项。

希望这可以帮助 ! 😇

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM