社区首页 >问答首页 >如何使用Jest和本机测试库正确测试反应本机模型

如何使用Jest和本机测试库正确测试反应本机模型
EN

Stack Overflow用户
提问于 2020-04-13 11:23:09
回答 3查看 5.6K关注 0票数 5

我很难理解如何测试我的模态组件。我正在使用反应-本机情态包和Jest附带的@测试-库/反应-本机。我的组件是一个在传递GraphQL错误时弹出的模式。

./ErrorMessage.js

代码语言:javascript
代码运行次数:0
复制
import React from 'react';
import PropTypes from 'prop-types';
import { Dimensions, Text } from 'react-native';
import Modal, { ModalContent, ScaleAnimation } from 'react-native-modals';
import { theme } from '../styles/theme.styles';

const ModalError = ({ error, onClose }) => {
  if (!error || !error.message) {
    return (
      <Modal visible={false}>
        <Text />
      </Modal>
    );
  }

  return (
    <Modal
      visible
      modalAnimation={
        new ScaleAnimation({
          initialValue: 0,
          useNativeDriver: true,
        })
      }
      onTouchOutside={onClose}
      swipeDirection={['up', 'down', 'left', 'right']}
      swipeThreshold={200}
      onSwipeOut={onClose}
      modalStyle={modalStyle}
      overlayOpacity={0.7}
    >
      <ModalContent>
        <Text testID="graphql-error">{error.message}</Text>
      </ModalContent>
    </Modal>
  );
};

ModalError.defaultProps = {
  error: {},
};

ModalError.propTypes = {
  error: PropTypes.object,
  onClose: PropTypes.func.isRequired,
};

export default ModalError;

const window = Dimensions.get('window');

const modalStyle = {
  backgroundColor: theme.lightRed,
  borderLeftWidth: 5,
  borderLeftColor: theme.red,
  width: window.width / 1.12,
};

到目前为止,我的测试相当简单。我只想确定它是在渲染模态。我不太清楚这里有什么需要嘲弄的东西,也不知道该怎么做。

./__tests__/ErrorMessage.test.js

代码语言:javascript
代码运行次数:0
复制
import React from 'react';
import { MockedProvider } from '@apollo/react-testing';
import { GraphQLError } from 'graphql';
import { render } from '@testing-library/react-native';
import Error from '../ErrorMessage';

jest.mock('react-native-modals', () => 'react-native-modals');

const error = new GraphQLError('This is a test error message.');
const handleOnCloseError = jest.fn();

describe('<ErrorMessage>', () => {
  it('should render an ErrorMessage modal component', () => {
    const { container } = render(
      <MockedProvider>
        <Error error={error} onClose={handleOnCloseError} />
      </MockedProvider>
    );
    expect(container).toMatchSnapshot();
  });
});

我所犯的错误是..。

代码语言:javascript
代码运行次数:0
复制
TypeError: _reactNativeModals.ScaleAnimation is not a constructor

      18 |       visible
      19 |       modalAnimation={
    > 20 |         new ScaleAnimation({
         |         ^
      21 |           initialValue: 0,
      22 |           useNativeDriver: true,
      23 |         })

快照只是打印..。

./__tests__/__snapshots__/ErrorMessage.test.js.snap

代码语言:javascript
代码运行次数:0
复制
// Jest Snapshot v1, 

exports[`<ErrorMessage> should render an ErrorMessage modal component 1`] = `
<View
  collapsable={true}
  pointerEvents="box-none"
  style={
    Object {
      "flex": 1,
    }
  }
/>
`;

如何克服这个错误并创建一个正确的快照?

EN

回答 3

Stack Overflow用户

发布于 2021-04-16 02:54:19

您可以使用这个-> https://github.com/testing-library/jest-native

代码语言:javascript
代码运行次数:0
复制
In react native component,
...
<Modal
        testID="test-modal"
        deviceWidth={deviceWidth}
        deviceHeight={deviceHeight}
        isVisible={isModalVisible}.  // isModalVisible = useState(true or false)
        onBackdropPress={toggleModal}
        backdropOpacity={0.5}
 >
...

In test component,
...
const test = getByTestId("test-modal");
expect(test).toHaveProp("visible", true);   // test success ! 
...
票数 1
EN

Stack Overflow用户

发布于 2022-01-06 09:50:41

代码语言:javascript
代码运行次数:0
复制
// components/Example/index.tsx
import React, { useState } from 'react';
import { Pressable, Text } from 'react-native';
import Modal from 'react-native-modal';

const Example: React.FC = () => {
  const [isPrivacyPolicyVisible, setIsPrivacyPolicyVisible] = useState(false);

  return (
    <>
      <Pressable onPress={() => setIsPrivacyPolicyVisible(true)}>
        <Text>Privacy Policy</Text>
      </Pressable>

      <Modal
        accessibilityLabel="privacy-policy-modal"
        isVisible={isPrivacyPolicyVisible}>
        <Text>Content</Text>
      </Modal>
    </>
  );
};

export default Example;
代码语言:javascript
代码运行次数:0
复制
// components/Example/index.test.tsx
import React from 'react';
import { fireEvent, render, waitFor } from '@testing-library/react-native';

import { Example } from 'components';

describe('Example Component', () => {
  it('should render privacy policy.', async () => {
    // Arrange
    const { queryByText, queryByA11yLabel } = render(<Example />);

    const button = queryByText(/privacy policy/i);
    const modal = queryByA11yLabel('privacy-policy-modal');

    // Act and Assert
    expect(button).toBeTruthy();
    expect(modal).toBeTruthy();
    expect(modal.props).toMatchObject({
      visible: false,
    });
  });

  it('should show privacy policy modal.', async () => {
    // Arrange
    const { queryByText, queryByA11yLabel } = render(<Example />);

    const button = queryByText(/privacy policy/i);
    const modal = queryByA11yLabel('privacy-policy-modal');

    // Act
    await waitFor(() => {
      fireEvent.press(button);
    });

    // Assert
    expect(modal.props).toMatchObject({
      visible: true,
    });
  });
});
票数 1
EN

Stack Overflow用户

发布于 2020-09-16 08:20:55

当您执行jest.mock('react-native-modals', () => 'react-native-modals');时,您将整个库替换为字符串“react本机-modals”,因此当您在组件中使用它时,它会失败。您需要从模拟函数返回一个完全模拟的实现(jest.mock的第二个参数)。这也是可能的,自动嘲弄可能对您有用,这将通过简单的执行:jest.mock('react-native-modals');

下面是jest.mock()的停靠库,并给出了使用它的各种方法的一些示例:https://jestjs.io/docs/en/jest-object#jestmockmodulename-factory-options

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

https://stackoverflow.com/questions/61195196

复制
相关文章
[译]Tornado web应用的结构
Tornado 4.3于2015年11月6日发布,该版本正式支持Python3.5的async/await关键字,并且用旧版本CPython编译Tornado同样可以使用这两个关键字,这无疑是一种进步。其次,这是最后一个支持Python2.6和Python3.2的版本了,在后续的版本了会移除对它们的兼容。现在网络上还没有Tornado4.3的中文文档,所以为了让更多的朋友能接触并学习到它,我开始了这个翻译项目,希望感兴趣的小伙伴可以一起参与翻译,项目地址是tornado-zh on Github,翻译好的文档在Read the Docs上直接可以看到。欢迎Issues or PR。
Jintao Zhang
2018/08/27
9010
Java Web之Tomcat目录结构和Web应用
如果Servlet版本小于3.0, 或者您不希望使用注解, 那么可以在web.xml中配置您的servlet程序, 一个最简单的实例如下:
望天
2018/08/02
1.8K0
Java Web之Tomcat目录结构和Web应用
[javaEE] web应用的目录结构&配置虚拟主机
|--web.xml 整个web的配置文件,配置主页,Servlet的映射,过滤器,监听器的配置
唯一Chat
2019/09/10
8020
5个免费的静态Web应用部署平台
为了确保评测间的公平性,我们采用了同一地区(四川成都)的三大运营商的网络进行测试。
pai233
2022/04/26
15.8K2
5个免费的静态Web应用部署平台
高性能电子商务平台构建(一)
1.设置:站点设置;帐号同步;上传设置;SEO设置;消息通知;支付方式;权限设置;配送地区;
硬核项目经理
2019/08/06
1.6K0
高性能电子商务平台构建(二)
1.圈子特点:创建自己的圈子(分类、名称、LOGO、介绍内容和公告等);独立的前台管理中心;主题列表多形式展示;
硬核项目经理
2019/08/06
9420
电子商务系统支付系统代码结构
这个套系统算是非常完整的,由我自己全程设计构建的系统。其他几套系统多多少少是与同事合作之类的,并没有那么完整的经验。
数商云网络科技
2020/08/24
7890
基于Flask的Web应用程序插件式结构
        事实上,很多应用程序基于插件式结构开发,可以很方便了扩展软件的功能,并且这些功能完全可以依托于第三方开发者,只要提供好接口和完备文档,比如wordpress、谷歌火狐浏览器等。
py3study
2020/01/20
8370
重拾Java Web应用的基础体系结构
一、背景 Spring生态的强大与完善,使得大多数的Java程序员,在刚刚接触Java Web应用开发时,往往依赖于SSM、SpringBoot等各种高级框架。 Java Web的基础的体系结构是什么?到底是怎么运作的?这些高级的框架与基础的体系结构之间是什么关系? 只有真正理清了这些底层基础的结构,才能完全理解高级框架的设计原理,在使用框架开发项目时做到事半功倍。 本文旨在暂时抛开这些高级框架,重走Java Web底层之路。二、Web应用 Web应用的基础模型 用户通过Web浏览器向某个Web应用发出一个
智慧zhuhuix
2020/08/26
5470
重拾Java Web应用的基础体系结构
重拾Java Web应用的基础体系结构
一、背景 Spring生态的强大与完善,使得大多数的Java程序员,在刚刚接触Java Web应用开发时,往往依赖于SSM、SpringBoot等各种高级框架。 Java Web的基础的体系结构是什么?到底是怎么运作的?这些高级的框架与基础的体系结构之间是什么关系? 只有真正理清了这些底层基础的结构,才能完全理解高级框架的设计原理,在使用框架开发项目时做到事半功倍。 本文旨在暂时抛开这些高级框架,重走Java Web底层之路。 二、Web应用 Web应用的基础模型 用户通过Web浏览器向某个Web应用发出一
智慧zhuhuix
2020/08/28
4430
重拾Java Web应用的基础体系结构
iOS平台快速发布HT for Web拓扑图应用
本文介绍了iOS平台上快速发布HT for Web拓扑图应用的一种方法,通过该方法可以快速发布基于HTML5的拓扑图应用,并借助PhoneGap Build打包成原生应用。主要步骤包括:1、使用PhoneGap和HT for Web构建HTML5拓扑图;2、使用Safari浏览器打开拓扑图;3、使用PhoneGap Build打包成原生应用。该方法将原生应用的发布流程和HTML5应用的优势结合起来,既缩短了应用上线流程,又能充分发挥HTML5应用的优势。
HT for Web
2018/01/03
1.5K0
iOS平台快速发布HT for Web拓扑图应用
前端微服务-面向web平台级应用的设计
从去年开始,前端领域就出现了一个‘微应用’的名词,说的是前端架构的一种设计思路,业内都把它和后端的微服务进行类比,当时忙于公司的项目。没有静下心来好好了解,现在项目结束,再加上最近看的几篇关于前端微服务的文章,(特别讨厌有些文章说的天花乱坠,引用各种高大上的名字,一篇通读下来什么也没有获得)回头一想,我们做的这个架构设计不就是 ‘微服务’吗?
用户3986961
2022/03/15
4600
前端微服务-面向web平台级应用的设计
交易类电子商务平台系统架构:在应用场景设计遵循的原则
电子商务平台企业打造一个交易型电商网站,首先必须考虑几个基本要素:用户、电商平台商品、订单信息等,那么要能够支持一个电子商务网站平台打造完整交易过程就需要包括用户信息、商品数据的匹配过程、安全支付过程、商品物流过程、产品售后服务沟通过程等。
数商云网络科技
2019/12/18
2.2K0
交易类电子商务平台系统架构:在应用场景设计遵循的原则
数据挖掘在电子商务中的应用
如何对大量信息进行有效组织利用,使用户能够从大量繁杂的信息中找出真正有价值的信息和知识,帮助企业制定更好的营销策略。信息处理技术有了新的应用研究课题——数据挖掘。
全栈程序员站长
2022/08/31
2.6K0
【商务智能】商务智能 ( 概念 | 组成 | 过程 )
【商务智能】数据预处理 【商务智能】数据仓库 ( 多维数据模型 | 多维数据分析 ) 【商务智能】商务智能 ( 概念 | 组成 | 过程 )
韩曙亮
2023/03/29
2.4K0
[行业分析]家电跨境电子商务平台解决方案
随着中国家电制造业日趋成熟,我国家电出口占全球家电产品出口总额逾1/4的比重,承接着来自全球小家电制造的产能。但由于近年来国际贸易环境日趋严峻,国内人力成本提高,加之代工市场竞争加剧,企业利润被不断压缩,家电出口企业面临巨大挑战,很多出口企业也已意识到转型迫在眉睫,必须尽快找到成功转向品牌升级的解决之道。
数商云市场营销总监
2023/02/10
6600
微服务实战: 从电子商务平台到微服务电子商务(Omni-Commerce)
对于企业来说,微服务比单体架构应用更灵活,尤其是零售和电子商务行业来说。了解这个解决方案面临的挑战和系统架构。
程序你好
2018/07/23
1.7K0
一款开源的跨平台实时web应用框架——DotNetify
今天给大家介绍一个开源的轻量级跨平台实时HTML+C#.NET Web应用程序开发框架——DotNetify,允许你在C#.NET后端上创建具有React、React Native、Vue或Blazor 前端的实时、响应式、跨平台应用程序。
张善友
2022/06/05
1.9K0
一款开源的跨平台实时web应用框架——DotNetify
点击加载更多

相似问题

基于google云平台的科学web应用体系结构

14

Web抓取-从Lazada电子商务平台中提取URL

12

从电子商务平台的搜索结果中抓取Nodejs web

110

电子商务web应用中的ObjectId of MongoDB

12

电子商务平台的比较

27
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档