【问题标题】:Code Coverage is to low on 'expecting to render' test in a specific Component特定组件中的“期望渲染”测试的代码覆盖率很低
【发布时间】:2018-12-20 13:56:21
【问题描述】:

我正在使用 react-test-render 在我的应用程序的特定组件上编写一个简单的测试,并且该测试期望组件呈现。

我已经尝试在测试文件上实现组件所需的属性,但仍然没有结果,组件的测试覆盖率仍然很低。测试通过了,我认为问题出在函数上。

   class Component extends React.PureComponent { 
        constructor(props, context) {
            super(props, context);

            this.function1 = this.function1.bind(this);
            this.function2 = this.function2.bind(this);
        }

        handleRef(element) {
            const { var1 } = this.props;

            this.iframe = element;
            if (var1) {
                var1(element);
            }
        }

        function2() {
            const {
                var2,
                var3,
                var4,
            } = this.props;

           if (!var2(this.iframe) && var3) {
           var3();
           localytics.tagEvent({ pageName: 'string' });
           return;
       }

       if (var3) {
            var3();
            performanceLog('The iframe has loaded at: ');
            localytics.tagEvent({ pageName: 'homepage:ok' });
       }
   }

       render() {

        //render html

     }
 }

AppFrame.propTypes = {
   //proptypes 
};

 AppFrame.defaultProps = {
      //default props
 };

 export default withStyles(styles)(AppFrame);

测试代码:

import React from 'react';
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16.3';
import renderer from 'react-test-renderer';

import AppFrame from '../index';

configure({ adapter: new Adapter() });

describe('<AppFrame />', () => {
   it('Expect to render', () => {
     const renderedComponent = renderer.create(
        <AppFrame var1="test" var2={() => {}} />
     ).toJSON();

expect(renderedComponent).toMatchSnapshot();
});
});

测试覆盖率截图:

【问题讨论】:

    标签: javascript reactjs unit-testing jestjs enzyme


    【解决方案1】:

    快照测试仅涵盖渲染项目,通常不考虑类中的其他方法。您可以调用instance 方法,并检查是否调用了stubbed 道具,即:

    这是enzyme's shallow renderer 的示例:

    import { shallow } from 'enzyme';
    
    describe('<AppFrame />', () => {
      const onErrorStub = jest.fn();
    
      it('Expect to render', () => {
        const renderedComponent = shallow(
           <AppFrame
              src="test"
              onLoad={() => {}}
              onError={onErrorStub}
              isLoadedSuccessfully={() => false} />
        );
    
        renderedComponent.instance().handleOnLoad();
        expect(onErrorStub).toBeCalled();
        });
    });
    

    您可能还想测试存根是否被称为with specific arguments

    另外,请查看您项目中的 coverage 文件夹 - 应该有一份关于(未涵盖)内容的详细报告。

    【讨论】:

    • 我得到TypeError: renderedComponent.getInstance(...).handleOnLoad is not a function 不幸的是,百分比没有改变@Alex
    • @ArsenCenko,奇怪,我检查时没问题。也许与withStyles hoc 相关的东西
    • 您检查过并且覆盖率达到 100% 吗?奇怪的是,我认为 %branch 是因为 handleOnLoad 函数中的条件:/ @Alex
    • 覆盖率肯定会增加,但要达到 100%,您必须覆盖所有此类方法(即 handleRef 也一样)。我通常按​​照我描述的方式进行操作,并且覆盖率变得更高——我可以肯定地说。因此,您可以将我的回答视为提高覆盖率的一般方向。 :) @ArsenCenko
    • 顺便说一句,你能用renderedComponent.root.handleOnLoad()代替getInstance吗?我通常更喜欢酶的shallow,而不是testRenderer.create,也许是相关的。 @ArsenCenko
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多