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

cod*_*ter 5 reactjs jestjs enzyme styled-components

我正在尝试测试我的样式组件。因此我安装了jest-styled-components.

我想测试我的组件在单击后是否改变不透明度。

我试过了toHaveStyleRule。但它说:

Property not found: "opacity"
Run Code Online (Sandbox Code Playgroud)

这是我的样式组件:

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 };
Run Code Online (Sandbox Code Playgroud)

我在这里导入它:

// 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;
Run Code Online (Sandbox Code Playgroud)

我的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() });
Run Code Online (Sandbox Code Playgroud)

最后是我的测试文件:

// 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);
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

调试clueWrapper.debug()看起来像这样:

<styled.div>
    <h3>
      Difficulty:
      200
    </h3>
    <hr />
    <p>
      q one
    </p>
    <hr />
    <ClueAnswer reveal={true} onClick={[Function]}>
      a one
    </ClueAnswer>
  </styled.div>
Run Code Online (Sandbox Code Playgroud)

我期望toHaveStyleRule获得不透明度的当前值,但我却遇到了所描述的问题。

有人有提示吗?

此致

And*_*rle 3

问题是,ClueAnswer当仅使用 渲染父组件时,并没有真正渲染shallow。使用mount代替也应该强制ClueAnswer渲染