代码之家  ›  专栏  ›  技术社区  ›  codelifter

JEST样式的组件-toHaveStyleRule未找到属性

  •  2
  • codelifter  · 技术社区  · 7 年前

    因此我安装了 jest-styled-components .

    我想测试一下,如果我的组件在点击后改变了不透明度。

    我试过了 toHaveStyleRule . 但它说:

    Property not found: "opacity"
    

    const ClueAnswer = styled.h3`
      transition: opacity 1s;
      transition-timing-function: ${props => props.reveal ? 'ease-out' : 'ease-in' };
      opacity: ${props => props.reveal ? 1 : 0};
      cursor: pointer;
    `;
    ClueAnswer.displayName = 'ClueAnswer';
    export { ClueAnswer };
    

    // Vendor
    import React, { Component } from 'react';
    // Styled Components
    import {
      ClueAnswer,
      ClueWrapper
    } from '../style/general';
    
    class Clue extends Component {
      constructor(props) {
        super(props);
    
        this.state = {
          reveal: false
        };
      }
    
      render() {
        const { clue } = this.props;
    
        return (
          <ClueWrapper>
            <h3>Difficulty: { clue.value }</h3>
            <hr />
            <p>{ clue.question }</p>
            <hr />
            <ClueAnswer
              reveal={ this.state.reveal }
              onClick={ () => this.setState(prevState => { return { reveal: !prevState.reveal } }) }>{ clue.answer }</ClueAnswer>
          </ClueWrapper>
        );
      }
    }
    
    export default Clue;
    

    我的 setupTest.js

    // Polyfill
    import raf from './polyfill';
    // Vendor
    import { configure } from 'enzyme';
    import Adapter from 'enzyme-adapter-react-16';
    import 'jest-styled-components';
    
    configure({ adapter: new Adapter() });
    

    最后是我的测试文件:

    // Vendor
    import React from 'react';
    import { shallow } from 'enzyme';
    // Component
    import Clue from './clue';
    // Fixtures
    import { clue } from '../data/fixtures';
    
    const props = { clue };
    
    describe('Clue Component', () => {
      const clueWrapper = shallow(<Clue { ...props } />);
    
      describe('and behavior on click', () => {
        const ClueAnswer = clueWrapper.find('ClueAnswer');
        const revealBeforeClick = clueWrapper.state('reveal');
        let revealAfterClick;
    
        beforeAll(() => {
          ClueAnswer.simulate('click');
          revealAfterClick = clueWrapper.state('reveal');
        });
    
        it('toggles reveal state on click', () => {
          expect(revealBeforeClick).not.toBe(revealAfterClick);
        });
    
        it('changes the opacity on click', () => {
          console.log(clueWrapper.debug());
          console.log(ClueAnswer.props());
          expect(ClueAnswer).toHaveStyleRule('opacity', 1);
        });
      });
    });
    

    的调试 clueWrapper.debug()

    <styled.div>
        <h3>
          Difficulty:
          200
        </h3>
        <hr />
        <p>
          q one
        </p>
        <hr />
        <ClueAnswer reveal={true} onClick={[Function]}>
          a one
        </ClueAnswer>
      </styled.div>
    

    我期望来自 为了得到不透明度的当前值,我得到了所描述的问题。

    顺致敬意,

    1 回复  |  直到 7 年前
        1
  •  2
  •   Andreas Köberle    7 年前

    问题是 ClueAnswer 仅使用渲染父组件时未真正渲染 shallow mount ClueAnswer俱乐部 待渲染