Test utils for styled-components compatible with jest, expect, chai and jasmine
MIT License
Test utils for styled-components compatible with jest, expect, chai and jasmine
This project is based on one simple idea: write a powerful set of test-utils for styled-components compatible with a lot assertion libraries. This is born from the willing to use jest-styled-components (a useful project on which this one is based) with expect.
You can install styled-components-test-utils using npm:
npm install --save-dev styled-components-test-utils
and if you haven't react-test-renderer
:
npm install --save-dev react-test-renderer
and following one of these: Jest, Expect, Chai, Jasmine
To use styled-components-test-utils with jest, you simply have to import the following:
import 'styled-components-test-utils/lib/jest';
// ...
expect(component).toHaveStyleRule(property, value);
To use styled-components-test-utils with expect, you have to do the following:
import expect from 'expect';
import injectStyledUtils from 'styled-components-test-utils/lib/expect';
injectStyledUtils(expect);
// ...
expect(component).toHaveStyleRule(property, value);
To use styled-components-test-utils with chai, you simply have to import the following:
import 'styled-components-test-utils/lib/chai';
// ...
expect(component).toHaveStyleRule(property, value);
To use styled-components-test-utils with jasmine, you have to do the following:
import injectStyledUtils from 'styled-components-test-utils/lib/jasmine';
describe('test', () => {
beforeAll(() => {
injectStyledUtils(jasmine);
});
// ...
expect(component).toHaveStyleRule(property, value);
// ...
});
Here is the list of the available APIs. Please, note that in the examples we are using react-test-renderer
but this library works also with react-test-renderer/shallow
and enzyme's shallow
, enzyme's mount
is not supported yet.
expect(tree).toHaveStyleRule(selector, value)
expect({ component, modifier, media }).toHaveStyleRule(selector, value)
expect({ css, props, modifier, media }).toHaveStyleRule(selector, value)
Asserts that tree
, component
or css
has a rule selector: value;
. You can also pass some additional parameters to test selectors and media queries, here is an example:
const Button = styled.button`
color: blue;
&:hover {
color: green;
}
@media screen and (max-width: 600px) {
&:hover {
color: yellow;
}
}
`;
const component = renderer.create(<Button />);
expect(component).toHaveStyleRule('color', 'blue');
expect({
component,
modifier: '&:hover', // works also with '> span' or 'html.test &' for example
}).toHaveStyleRule('color', 'green');
expect({
component,
modifier: '&:hover',
media: 'screen and (max-width: 600px)', // search rule in the given media
}).toHaveStyleRule('color', 'yellow');
// you can also pass to media an object that should be thought of
// as if it is the current state of a device/browser.
// a type value must be specified, and it can not be "all".
// The returned rule is the one applied under those conditions
expect({
component,
modifier: '&:hover',
media: {
type: 'screen',
width: '500px',
},
}).toHaveStyleRule('color', 'yellow');
const style = css`
color: ${props => props.primary ? props.theme.primary : 'white'}
`;
expect({
css: style,
props: {
theme: {
primary: 'purple',
},
},
}).toHaveStyleRule('color', 'purple');
expect(tree).toNotHaveStyleRule(selector)
expect({ component, modifier, media }).toNotHaveStyleRule(selector)
expect({ css, props, modifier, media }).toNotHaveStyleRule(selector)
Asserts that tree
, component
or css
has no rule selector: value;
. You can also pass some additional parameters to test selectors and media queries, as you can do with toHaveStyleRule, here is an example:
const Button = styled.button`
color: blue;
`;
const component = renderer.create(<Button />);
expect(component).toNotHaveStyleRule('background-color');
expect(keyframe).toHaveKeyframeRule(keyframeSelector, selector, value)
Asserts that keyframe
has a rule selector: value;
contained in keyframeSelector
.
import steps from './animationSteps';
const fadeIn = keyframes`
${steps.map(step => `
${step.perc}% {
opacity: ${step.opacity};
}
`).join('')}
`;
expect(fadeIn).toHaveKeyframeRule('0%', 'opacity', '0');
expect(fadeIn).toHaveKeyframeRule('100%', 'opacity', '1');
expect(styledComponent).toHaveComponent(component)
Asserts that styledComponent
has component component
.
import Foo from './Foo';
const Button = styled.button``;
expect(Button).toHaveComponent('button');
const Bar = Button.withComponent(Foo);
expect(Bar).toHaveComponent(Foo);
expect(style).toBeAGlobalStyle()
Asserts that style
is a global style.
import fontFamily from './fontFamily';
injectGlobal`
input {
font-family: ${fontFamily};
}
`;
expect(`
input {
font-family: Roboto;
}
`).toBeAGlobalStyle();
⚠️ Jest only ⚠️
expect(tree).toMatchSnapshot()
This matcher is used to assert complex selectors or to test your entire component in one go.
const tree = renderer.create(<MyComponent />).toJSON();
expect(tree).toMatchSnapshot();
If you want to use it with enzyme you also need to install enzyme-to-json
npm install --save-dev enzyme-to-json
and use it as follows
import { shallow } from 'enzyme';
import toJSON from 'enzyme-to-json';
test('with enzyme', () => {
const wrapper = shallow(<MyComponent />);
const tree = toJSON(wrapper);
expect(tree).toMatchSnapshot();
})
or, you can enable it globally in your package.json
:
"jest": {
"snapshotSerializers": [
"enzyme-to-json/serializer"
]
}
and use it as follows
import { shallow } from 'enzyme';
test('with enzyme', () => {
const tree = shallow(<MyComponent />);
expect(tree).toMatchSnapshot();
})
This project adheres to Semantic Versioning. Every release, along with the migration instructions, is documented on the Github Releases page.
Matteo Basso
Copyright for portions of project styled-components-test-utils are held by Michele Bertoli, 2017 as part of project jest-styled-components. All other copyright for project styled-components-test-utils are held by Matteo Basso.
Copyright (c) 2017, Matteo Basso.
styled-components-test-utils source code is licensed under the MIT License.