搜索
简帛阁>技术文章>jest单测知多少

jest单测知多少

文章目录

  • 断言
  • mock内容
    • mock一个不存在的文件
    • mock模块中的某个功能,并且保留模块原有的功能
    • mock一个类
    • mock类的静态方法
    • 检测多个判断,多次mock一个内容
    • mock process.cwd()内容
  • 特殊处理
    • 检测console.log

断言

mock内容

mock一个不存在的文件

const {<!-- --> myFunc } = require('does not exist')
jest.mock('does not exist',
  () => ({<!-- -->
    myFunc: () => 'hello',
    obj: {<!-- -->}
  }),
  {<!-- --> virtual: true }
);
test('mock file that does not exist', () => {<!-- -->
	expect(myFunc()).toBe('hello')
})

mock模块中的某个功能,并且保留模块原有的功能

模拟Taro的login API

jest.mock('@tarojs/taro', () => {<!-- -->
  const login = jest.fn(async (): Promise<{<!-- --> code: string;errMsg: string }> => {<!-- -->
    return Promise.resolve({<!-- --> code: '122321121', errMsg: 'is:ok' })
  })
  return {<!-- -->
    ...jest.requireActual('@tarojs/taro-h5'),
    login
  }
})

mock一个类

// myClass.js
class MyClass {<!-- -->
  constructor(name) {<!-- -->
    this.name = name;
  }
  methodOne() {<!-- -->
    return 1;
  }
  methodTwo() {<!-- -->
    return 2;
  }
}
export default MyClass;
jest.mock('./myClass', () => () => ({<!-- -->
  name: 'Jody',
  methodOne: () => 10,
  methodTwo: () => 25,
}));

mock类的静态方法

export class MockedClass {<!-- -->
  public instanceMethod(): string {<!-- -->
    return "instance";
  }
  public static staticMethod(): string {<!-- -->
    return "static";
  }
}
import {<!-- -->MockedClass} from './mocked-class'
jest.mock('./mocked-class');

describe('TestClass', () => {<!-- -->
  it ('should mock instance method', () => {<!-- -->
    const expectedValue: string = 'instanceMocked'
    MockedClass.mockImplementation(() => {<!-- -->
      return {<!-- -->
        instanceMethod: () => expectedValue
      };
    });

    const actualValue: string = new TestClass().callStaticMethod();

    expect(actualValue).toBe(expectedValue);
  });


  it ('should mock static method', () => {<!-- -->
    const expectedValue: string = 'staticMocked'
    MockedClass.staticMethod.mockImplementation(() => expectedValue);

    const actualValue: string = new TestClass().callStaticMethod();

    expect(actualValue).toBe(expectedValue);
  });
});

检测多个判断,多次mock一个内容

原函数

async getMultipleNamespace() {<!-- -->
     const _ApolloConfig = SYSTEM_APOLLO_CONFING;
     // 数组
     if (Array.isArray(_ApolloConfig)) {<!-- -->
         for (const i in _ApolloConfig) {<!-- -->
             await this.getSystem(_ApolloConfig[i]);
         }
         return;
     }
     // 对象中的某一项是数组
     if (Array.isArray(_ApolloConfig.namespace)) {<!-- -->
         const _namespaces = _ApolloConfig.namespace;
         delete _ApolloConfig.namespace;
         for (const i in _namespaces) {<!-- -->
             await this.getSystem(Object.assign(_ApolloConfig, {<!-- --> namespace: _namespaces[i] }));
         }
         return;
     }
     // 单对象
     await this.getSystem();
 }

jest内容

describe('测试多重判断', () => {<!-- -->
    beforeEach(() => {<!-- -->
        jest.resetModules();
    });
    test('getMultipleNamespace——检测单个config单个namespace', async () => {<!-- -->
        jest.mock('../script/Config',()=>{<!-- -->
            const SYSTEM_APOLLO_CONFING = {<!-- -->
                appId: 'fedsystem',
                cluster: 'default',
                namespace: 'application'
            }
            return {<!-- -->
                ...jest.requireActual('../script/Config'),
                SYSTEM_APOLLO_CONFING
            }
        })
        // 一定要重新执行一次
        const apollo = require('../index');
        const getSystem = apollo.getSystem;
        const fn = jest.fn();
        apollo.getSystem = function (...ret) {<!-- -->
            getSystem(...ret);
            fn();
        }
        await apollo.getMultipleNamespace();
        // 检测该方法是否被调用即可
        expect(fn).toHaveBeenCalledTimes(1);
    })
    test('getMultipleNamespace——检测多个config', async () => {<!-- -->
        jest.mock('../script/Config',()=>{<!-- -->
            const SYSTEM_APOLLO_CONFING = [{<!-- -->
                appId: 'fedsystem',
                cluster: 'default',
                namespace: 'application'
            },{<!-- -->
                appId: 'fedsystem',
                cluster: 'default',
                namespace: 'default'
            }]
            return {<!-- -->
                ...jest.requireActual('../script/Config'),
                SYSTEM_APOLLO_CONFING
            }
        })
        const apollo = require('../index');
        const getSystem = apollo.getSystem;
        const fn = jest.fn();
        apollo.getSystem = function (...ret) {<!-- -->
            getSystem(...ret);
            fn();
        }
        await apollo.getMultipleNamespace();
        // 检测该方法是否被调用即可
        expect(fn).toHaveBeenCalledTimes(2);
    })
    test('getMultipleNamespace——检测单个config多个namespace', async () => {<!-- -->
        jest.mock('../script/Config',()=>{<!-- -->
            const SYSTEM_APOLLO_CONFING = {<!-- -->
                appId: 'fedsystem',
                cluster: 'default',
                namespace: ['application', 'default']
            }
            return {<!-- -->
                ...jest.requireActual('../script/Config'),
                SYSTEM_APOLLO_CONFING
            }
        })
        const apollo = require('../index');
        const getSystem = apollo.getSystem;
        const fn = jest.fn();
        apollo.getSystem = function (...ret) {<!-- -->
            getSystem(...ret);
            fn();
        }
        await apollo.getMultipleNamespace();
        // 检测该方法是否被调用即可
        expect(fn).toHaveBeenCalledTimes(2);
    })
})

mock process.cwd()内容

const projectConfig = require(path.join(process.cwd(), 'config'));
jest.mock('../config',
    () => ({<!-- -->
        obj: {<!-- -->}
    }),
    {<!-- --> virtual: true }
);

特殊处理

检测console.log

文件hello.js

console.log("Hello World"); 

文件hello.test.js

let outputData = ""; 
storeLog = inputs => (outputData += inputs); 
test("console log Hello World",() => {<!-- --> 
    console["log"] = jest.fn(storeLog); 
    require("./hello.js"); 
    expect(outputData).toBe("Hello World"); 
}); 
文章目录断言mock内容mock一个不存在的文件mock模块中的某个功能,并且保留模块原有的功能mock一个类mock类的静态方法检测多个判断,多次mock一个内容mockprocesscwd()内容
EnglishVersion|中文版深入浅出Jest框架的实现原理https://githubcom/Wscats/jesttutorial什么是JestJest是Facebook开发的Javascr
Jest中Mock网络请求最近需要将一个比较老的库修改为TS并进行单元测试,修改为TS还能会一点,单元测试纯粹是现学现卖了,初学Jest框架,觉得在单元测试中比较麻烦的就是测试网络请求,所以记录一下M
Jest官网Jest文档JestAPI1Mock的作用捕获函数的调用和返回结果,以及this和调用顺序可以自由设置返回结果改变函数的内部实现2VSCodeJest插件:Jest可自动运行npmrunt
MySQL表最大记录数不能超过多少?很多人困惑这个问题。其实,MySQL本身并没有对表最大记录数进行限制,这个数值取决于你的操作系统对单个文件的限制本身。从性能角度来讲,MySQL表数据不要超过
MySQL表最大记录数不能超过多少?很多人困惑这个问题。其实,MySQL本身并没有对表最大记录数进行限制,这个数值取决于你的操作系统对单个文件的限制本身。从性能角度来讲,MySQL表数据不要超过
目录例模式概念例模式使用场景python实现例模式总结例模式概念例模式:“保证一个类仅有一个实例,并提供一个访问它的在这里插入代码片全局访问点。例模式会阻止其他对象实例化其自己的例对象的
JestClient是一款基于HTTP实现的ES客户端,在RestHighLevelClient出现之前,它填补了ES缺少HTTPREST接口客户端的空白。JestClient具有一定的ES服务端版本
(1)、添加依赖1<dependency>2<groupId>iosearchbox</groupId>3<artifactId>jest</ar
1安装yarnglobaladdjestcliornpminstallgjestcli备注:可以安装为依赖不用全局安装2项目代码a项目初始化yarninity├──packagejson├──sumj