在React Native中运行mount()不可能吗? [英] running mount() in react native Not Possible?

查看:96
本文介绍了在React Native中运行mount()不可能吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这篇文章跟着我之前的问题:

This post follows up with my previous question:

上一个问题

我遇到了一个测试,该测试需要我在react native中运行mount.我开玩笑地浏览了文档,发现运行测试套件之前,您特别需要设置一个能够运行jsdom的测试环境以使安装工作:

I have come across a test which requires me to run mount in react native. I have gone through the documentation in jest and have found that before running the test suite you specifically need to setup a test environment capable of running jsdom for mount to work:

文档链接为: testEnvironment

因为它是可怕的文档.我不知道如何创建customEnvironment类,之后又如何?我如何处理全局对象?当前在我的测试文件中如何使用它:

Because of it's horrible documentation. I can't figure out how to create the customEnvironment class and what after that? what do I do with the global object? How to use it in my test file which currently looks like:

describe('Estimate', () => {
  test('Estimate component Exists', () => {
    const onPressFunction = jest.fn()
    const obj = shallow(
      <Estimate onPress={onPressFunction} />
    )
    expect(obj.find('TextInput').exists()).toBe(true)
  })

  test('Estimate returns value on button press', () => {
    const onPressFunction = jest.fn()
    const obj = shallow(
      <Estimate onPress={onPressFunction} />
    )
    obj.find('TextInput').first().simulate('keypress', { key: '1' })
    obj.find('Button').first().props().onPress()
    expect(onPressFunction.toHaveBeenCalledWith('1'))
  })
})

推荐答案

我刚刚使它不得不从npm导入三个软件包:

I just made it work had to import three packages from npm:

  1. jsdom
  2. react-native-mock-renderer
  3. jest-environment-jsdom

我的setup.mjs文件看起来也像这样:

Also my setup.mjs file looks like:

// @note can't import shallow or ShallowWrapper specifically
import Enzyme from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'
// eslint-disable-next-line
import { format } from 'prettier'

Enzyme.configure({ adapter: new Adapter() })

// Make Enzyme functions available in all test files without importing
global.shallow = Enzyme.shallow

Enzyme.ShallowWrapper.prototype.jsx = function jsx () {
  const placeholder = '{ something: null }'
  const obj = this.debug({ ignoreProps: false, verbose: true }).replace(/{\.\.\.}/g, placeholder)

  return format(obj, {
    parser: 'babylon',
    filepath: 'test/setup.mjs',
    trailingComma: 'all',
    semi: false,
    arrowParens: 'always',
  })
    .replace(new RegExp(placeholder, 'g'), '{...}')
    .replace(';<', '<')
}
// the html function just throws errors so it's just reset to be the jsx function
Enzyme.ShallowWrapper.prototype.html = Enzyme.ShallowWrapper.prototype.jsx

jest.mock('react-native-device-info', () => {
  return {
    getDeviceLocale: () => 'en',
    getDeviceCountry: () => 'US',
  }
})

jest.mock('react-native-custom-tabs', () => ({
  CustomTabs: {
    openURL: jest.fn(),
  },
}))

jest.mock('react-native-safari-view', () => ({
  isAvailable: jest.fn(),
  show: jest.fn(),
}))



const { JSDOM } = require('jsdom')


const jsdom = new JSDOM()
const { window } = jsdom
function copyProps (src, target) {
  const props = Object.getOwnPropertyNames(src)
    .filter((prop) => typeof target[prop] === 'undefined')
    .map((prop) => Object.getOwnPropertyDescriptor(src, prop))
  Object.defineProperties(target, props)
}

global.window = window
global.document = window.document
global.navigator = {
  userAgent: 'node.js',
}
copyProps(window, global)
Enzyme.configure({ adapter: new Adapter() })

// Ignore React Web errors when using React Native
// allow other errors to propagate if they're relevant
const suppressedErrors = /(React does not recognize the.*prop on a DOM element|Unknown event handler property|is using uppercase HTML|Received `true` for a non-boolean attribute `accessible`|The tag.*is unrecognized in this browser)/
const realConsoleError = console.error
console.error = (message) => {
  if (message.match(suppressedErrors)) {
    return
  }
  realConsoleError(message)
}
require('react-native-mock-render/mock')

测试如下:

 test('Estimate returns value on button press', () => {
    const onPressFunction = jest.fn()
    const tree = mount(
      <Estimate onPress={onPressFunction} />
    )
    console.log(tree.children().first().html())
  })

像魅力一样工作!

这篇关于在React Native中运行mount()不可能吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆