博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React 16 Jest单元测试 之 Mock Functions (Mocking Modules 和 Mock Implementations)
阅读量:5993 次
发布时间:2019-06-20

本文共 2411 字,大约阅读时间需要 8 分钟。

转载

项目初始化【这里使用之前的项目,节省时间】

项目初始化地址

tag:v_1.0.21

拉取

git clone  cd webpack4-react16-reactrouter-demogit fetch origingit checkout v_1.0.21npm install

 

Mocking Modules

假设我们有一个从API中获取用户的类。该类使用axios调用API然后返回包含所有用户的data属性:

因为要用到axios,需要安装下axios,

运行

npm install axios --save

 

然后创建文件src/lib/user.js

import axios from 'axios';class Users {  static all() {    return axios.get('/user.json').then(resp => resp.data);  }}export default Users;

创建文件src/__tests__/user.test.js

import axios from 'axios';import Users from '../lib/user';jest.mock('axios');test('should fetch users', () => {  const resp = {    data: [      {        name: 'Durban',      },    ],  };  axios.get.mockResolvedValue(resp);  // 或者也可以使用下面的代码  // axios.get.mockImplementation(() => Promise.resolve(resp));  return Users.all().then(users => expect(users).toEqual(resp.data));});

现在,为了不在实际访问API的情况下测试此方法(从而创建缓慢且脆弱的测试),我们可以使用jest.mock(...)函数自动模拟axios模块。

 

一旦我们模拟了模块,我们就可以为.get提供一个mockReturnValue,它返回我们测试希望要的断言数据。实际上,我们说我们希望axios.get('/users.json')返回一个假响应。

 

Mock Implementations

尽管如此,有些情况下超出指定返回值的能力和全面替换模拟函数的实现是有用的。这可以使用jest.fn或mock函数上的mockImplementationOnce方法来实现。如下

const myMockFn = jest.fn(cb => cb(null, true));myMockFn((err, val) => console.log(val));// > truemyMockFn((err, val) => console.log(val));// > true

当需要定义从另一个模块创建的模拟函数的默认实现时,mockImplementation方法很有用,如下

// foo.jsmodule.exports = function() {  // some implementation;};// test.jsjest.mock('../foo'); // this happens automatically with automockingconst foo = require('../foo');// foo is a mock functionfoo.mockImplementation(() => 42);foo();// > 42

当需要重新创建模拟函数的复杂行为,以便多个函数调用产生不同的结果时,请使用mockImplementationOnce方法,如下

const myMockFn = jest  .fn()  .mockImplementationOnce(cb => cb(null, true))  .mockImplementationOnce(cb => cb(null, false));myMockFn((err, val) => console.log(val));// > truemyMockFn((err, val) => console.log(val));// > false

当mocked函数超出了mockImplementationOnce定义的实现次数时,它将使用jest.fn执行默认实现集(如果已定义),如下

const myMockFn = jest  .fn(() => 'default')  .mockImplementationOnce(() => 'first call')  .mockImplementationOnce(() => 'second call');console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn());// > 'first call', 'second call', 'default', 'default'

对于我们有通常链接的方法(因此总是需要返回这个)的情况,我们有一个含糖API,以.mockReturnThis()函数的形式简化它,该函数也位于所有模拟上,如下

const myObj = {  myMethod: jest.fn().mockReturnThis(),};

跟如下是类似的

const otherObj = {  myMethod: jest.fn(function() {    return this;  }),};

项目实践地址

tag:v_1.0.22
你可能感兴趣的文章
如何在MAP/REDUCE中不检查输出路径?
查看>>
Redis系列--6、Redis Java连接操作
查看>>
Python之encode与decode浅析
查看>>
记一次windows下oracle的整库移动
查看>>
MPLS TE 流量工程路径选择原理和配置模板 for CISCO
查看>>
mysql replication(主从复制)(二)MSS模式
查看>>
APP-V序列化服务器部署,应用程序虚拟化部署笔记四
查看>>
一段查看终端端口的asp代码
查看>>
关闭默认共享-注册表-批处理
查看>>
apache_1.3.41+mysql-4.0.26+php-4.4.8+Redhat5 linux
查看>>
在Eclipse中使用Checkstyle
查看>>
Hive查询失败:no LazyObject for VOID
查看>>
AD+EXCHANGE邮件服务器的迁移实战<一>
查看>>
Server and PC naming management
查看>>
在esx server上导入其它vmfs storage
查看>>
Oracle Study---Oracle 11g 不可见索引案例
查看>>
WSDL 规则解释
查看>>
后智能手机时代之我想
查看>>
ORA-00900 修改props$中字符集导致
查看>>
html5手机网站需要加的那些meta/link标签,html5 meta全解
查看>>