JEST STYLED COMPONENTS - toHaveStyleRule 没有找到属性

Posted

技术标签:

【中文标题】JEST STYLED COMPONENTS - toHaveStyleRule 没有找到属性【英文标题】:JEST STYLED COMPONENTS - toHaveStyleRule didn't find property 【发布时间】:2018-03-14 23:48:35 【问题描述】:

我正在尝试测试我的样式化组件。 因此我安装了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>

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

有人有提示吗?

最好的问候

【问题讨论】:

您是否尝试过自己测试ClueAnswer。我认为问题在于,shallow 不会渲染子组件,而只会渲染传入的组件。那么您可以尝试使用shallow(&lt;ClueAnswer/&gt;) 或在您的示例中使用mount 而不是“shallow”。 @AndreasKöberle 非常感谢!你完全正确。我只是忘记了浅不安装子组件。我现在改为使用“mount”。它像我预期的那样工作。 【参考方案1】:

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

【讨论】:

以上是关于JEST STYLED COMPONENTS - toHaveStyleRule 没有找到属性的主要内容,如果未能解决你的问题,请参考以下文章

text jest / styled-components快照bug ...

Jest styled-components 4.1.1 测试被破坏

Jest with Styled Components 错误:解析预期 css 的语法错误:缺少“”

styled-components - 测试 createGlobalStyle

由于不同的类索引,使用 Styled-Components 的快照测试在 CI 管道中失败

为啥在运行玩笑测试时出现“未定义:x:y:属性”缺失错误?