首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过酶和反应本土化的玩笑来模拟后退按钮

如何通过酶和反应本土化的玩笑来模拟后退按钮
EN

Stack Overflow用户
提问于 2019-02-12 11:54:36
回答 2查看 5.5K关注 0票数 3

我无法通过使用带有react本机代码的酶类/玩笑来模拟硬件回退按钮。还提到我对酶/Jest的反应是新的--本土的

我遵循下面的链接并尝试实现。不幸的是,我无法做到这一点。

如何在本机测试中模拟android back按钮

Sample.js,

代码语言:javascript
运行
复制
import React, { Component } from "react";
import {
  View,
  Text,
  BackHandler,
  BackAndroid
} from "react-native";

  componentWillMount() {
    BackHandler.addEventListener('hardwareBackPress', this.handleBackButtonPress);
  }

  componentWillUnmount() {
    BackHandler.removeEventListener('hardwareBackPress', this.handleBackButtonPress);
  }

  handleBackButtonPress = () => {
    return true;
  };

sample.test.js,

代码语言:javascript
运行
复制
import 'react-native';
import React from "react";
import  mockPressBack  from 'react-native';

jest.mock('BackHandler', () => {
    return {
        addEventListener: mockPressBack
    };
});

describe('sample verifies', ()=>{
      test('back button press', ()=> {
        const wrapper = shallow(<Sample />);
    const sampleData = wrapper.instance();
    sampleData.componentWillMount(); 
    });
});

实际结果: TypeError:_reactNative.BackHandler.addEventListener不是一个函数

预期结果:成功运行。

我在这里被击中了。请帮帮我。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2019-02-12 22:20:45

实际上,它被推荐用于模拟大多数(如果不是所有依赖项)的单元测试。很小的一点是,嘲弄适用于整个模块,所以如果您需要模拟特定的export,但需要保留另一个模块,那么它就需要额外努力

您只需模拟BackHandler组件即可。但如果你写的东西

代码语言:javascript
运行
复制
jest.mock('react-native');
// ...

你会发现说错了

BackHandler.addEventListener不是一个函数

这是因为基本jest.mock()jest.fn()模拟函数替换每个导出。但是BackHandler最初不是一个函数,它是一个对象。

因此,您需要手动模拟模块,为BackHandler提供值。

代码语言:javascript
运行
复制
import { BackHandler } from 'react-native'; // it's needed to direct access mocked version

jest.mock('react-native', () => {
  BackHandler: { 
    addEventListener: jest.fn(),
    removeEventListener: jest.fn(),
  }
});

describe('Sample', () => { 
  it('binds to BackHandler on mount and clean up on destroy', () => {
    const wrapper = shallow(<Sample />);
    expect(BackHandler.addEventListener).toHaveBeenCalledWith('hardwareBackPress');
    wrapper.unmount();
    expect(BackHandler.removeEventListener).toHaveBeenCalledWith('hardwareBackPress');
  });

为了模拟hardwareBackPress,我建议了几种不同的方法:

  1. 使用实际存储回调来模拟addEventListener/removeEventListener (这种方法很清楚,但需要额外的代码--而且它还需要在测试用例之间进行清理) const回调= {};函数helperTriggerListeners(eventName,event) { (callbackseventName欧元/[]).forEach(回调=>回调(事件));}jest.mock(‘function eventName’,() => { BackHandler:{ addEventListener: jest.fn(eventName,回调) => { callbackseventName = callbackseventName回呼[];callbackseventName.psuh(回调);),removeEventListener: jest.fn().mockImplementation((eventName,回调) => { const indexOf = (callbackseventName颇具[]).indexOf(回调);if (indexOf = -1) { callbackseventName = callbackseventName.splice(indexOf,1);}},});beforeEach(() => { //确实重要,以确保从旧的运行回调= {};BackHandler.addEventListener.mockClear();( expect(someOtherMockedService.someMethod).toHaveBeenCalled(););BackHandler.removeEventListener.mockClear ();它(‘.’,() => { helperTriggerListeners('hardwareBackPress‘),{ /*模拟事件(如果需要*/});
  2. 直接从addEventListener模拟日志进行回调: BackHandler.addEventListener.mock.calls.forEach(oneCall ( () => { //非常重要,否则您可以为已经卸载的组件调用回调;BackHandler.removeEventListener.mockClear();});它(‘在硬件callbacks上的反应’,() => { const包装器=浅层();beforeEach => { if (oneCall === ' hardwareBackPress‘) oneCall1;})
票数 4
EN

Stack Overflow用户

发布于 2022-09-20 08:48:04

React本机已经对此进行了模拟,如果不添加以下内容,您可以将其添加到项目中:

代码语言:javascript
运行
复制
//__mocks__/globalMock.ts

jest.mock('react-native/Libraries/Utilities/BackHandler', () => {
  return jest.requireActual(
    'react-native/Libraries/Utilities/__mocks__/BackHandler.js',
  );
});
代码语言:javascript
运行
复制
//jest.config.js

module.exports = {
    ....
    'setupFilesAfterEnv': [
        '<rootDir>/__mocks__/globalMock.ts',
    ],
};
代码语言:javascript
运行
复制
// amazing test

  it('BackHandler', () => {
    const onClose = jest.fn();
    render(<SomeComp onClose={onClose} />);
    // look into node_modules/react-native/Libraries/Utilities/__mocks__/BackHandler.js
    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    // @ts-ignore
    BackHandler.mockPressBack();

    expect(onClose).toHaveBeenCalled();
  });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54649576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档