当它被包装在提供者组件中时,如何使用 mocha + 酶 + chai 测试反应原生组件

Posted

技术标签:

【中文标题】当它被包装在提供者组件中时,如何使用 mocha + 酶 + chai 测试反应原生组件【英文标题】:How can I test react-native component with mocha + enzyme + chai when it's wrapped in a Provider component 【发布时间】:2017-05-29 17:13:41 【问题描述】:

我正在使用 mocha、enzyme、chai 和一些模拟库来使测试成为可能。所以,TestComponent.js的内容如下,我配置了store并传递给provider,而DeskScreen是连接组件:

import mockery from "mockery";
import 'babel-polyfill';
import reactNativeSvgMock from "react-native-svg-mock";
mockery.enable();
mockery.registerMock("react-native-svg", reactNativeSvgMock);
var DeskScreen = require( '../app/containers/DeskScreen/DeskScreen');
import React, View, Text, StyleSheet from 'react-native';
import Provider from 'react-redux';
import shallow, render, mount from 'enzyme';
import expect from 'chai';
import configureStore from 'redux-mock-store';
import reducer from "../app/reducers";
import Button from "../app/containers/Common/Button";
import ButtonWithNoFlex from "../app/containers/Common/ButtonWithNoFlex";
const mockStore = configureStore([]);

describe('<Test />', () => 
    it('it should render 1 view component', () => 
        const store = mockStore(reducer);
        var comp = shallow(
         <Provider store=store>
            <DeskScreen/>
        </Provider>
    );
        expect(button).to.have.length(1);
        expect(comp.find(View)).to.have.length(1);
    );
);

运行命令 npm test 后,它会生成以下内容:

1) it should render 1 view component


  0 passing (1s)
  1 failing

  1) <Test /> it should render 1 view component:
     AssertionError: expected  Object (root, unrendered, ...)  to have a length of 1 but got 0
      at Context.<anonymous> (test/TestComponent.js:22:41)

也许原因是我使用了 shallow 而不是 mount,但据我所知 mount 不适用于 react-native。无论如何,我想以某种方式测试连接的组件。

【问题讨论】:

【参考方案1】:

我认为解决问题的方法有两种。

1。导出普通组件

在您的组件文件中将组件导出为命名导出,您可以在测试中使用它。

// Export the plain component as named component
export class MyComponent 
    // ...


export default connect(mapStateToProps)(MyComponent);

您的测试通过命名导入导入普通组件:

import  MyComponent  from './MyComponent';

// Use it in your tests

2。通过shallow 提供上下文

如果您通过上下文提供商店,则可以使用连接的组件。这就是&lt;Provider&gt; 所做的。

import  shallow  from 'enzyme';
import  createStore  from 'redux';

// reducer could be a real reducer or a mock fake reducer.
const store = createStore(reducer);

it('my test', () => 
    const wrapper = shallow(
        <MyComponent>,
         context:  store  
    );

    // test your component here
);

【讨论】:

你的 2 上的疯狂道具。通过浅层提供上下文——帮了我很多!

以上是关于当它被包装在提供者组件中时,如何使用 mocha + 酶 + chai 测试反应原生组件的主要内容,如果未能解决你的问题,请参考以下文章

当它在指针c ++中时如何使用继承类的真实功能

当它在 而不是 [] 中时,我如何从 api 中获取东西

iText:如何在提交 Pdf 表单后重定向到 url,当它显示在 iframe 中时?

OpenMP 中的同步

如何在 Mocha 单元测试中访问命名空间的 Vuex getter

使用 Mocha/Chai 测试复杂的 React 组件