Ich versuche, einen Teil einer Komponente zu testen, die nicht angezeigt wird, wenn der Browser kein Flash-Plugin hat. Die Komponente erkennt das Flash-Plugin mit Hilfe von swfObject und der unten genannten Logik.Running Karma Test mit Browser-Flash-Plugin deaktiviert
MyComponent.js
export default class MyComponent extends Component {
static propTypes = {
// props...
};
static contextTypes = {
router: PropTypes.object.isRequired,
};
constructor() {
super();
this.state = {
isMobile: true
};
}
componentDidMount() {
const flashVersion = require('../../../client/utils/detectFlash')();
if ((flashVersion && flashVersion.major !== 0)) {
/* eslint-disable */
this.setState({isMobile: false});
/* eslint-enable */
}
}
//...
render() {
//...
return (
//...
{ !this.state.isMobile && (
<div className="xyz">
<p>XYZ: this content only shows up when flash has been detected</p>
</div>)
}
);
}
}
MyComponent-test.js
import React from 'react';
import {mount} from 'enzyme';
import chai, {expect} from 'chai';
import chaiEnzyme from 'chai-enzyme';
import configureStore from 'redux-mock-store';
import { Provider } from 'react-redux';
import {MyComponent} from '../../common/components';
chai.use(chaiEnzyme());
describe('<MyComponent />',() => {
describe('mobile/flash disabled',() => {
const mockStore = configureStore({});
const store = mockStore({});
it('Does not render xyz',() => {
const wrapper = mount(
<Provider store={store} key="provider">
<MyComponent {...params}/>
</Provider>
);
expect(wrapper.find('.xyz').to.have.length(0));
});
});
});
Das Problem ist this.state.isMobile auf false gesetzt als Karma erkannt Chrom und Flash-Plugin startet. Wie Sie sich vorstellen können, funktioniert der Test auch nicht, wenn Sie das Flash-Plugin von Chrome manuell deaktivieren müssen.
Ich stimme zu, und ich würde tatsächlich so weit gehen zu sagen, dass die Prüfung an der Wurzelkomponente passieren und über den Zustand reflektieren sollte. Für den Zweck dieses Tests hoffte ich jedoch, eine solche Änderung zu vermeiden. –
Sie könnten beides tun. Wenn Sie die property isMobile verwenden, verwenden Sie andernfalls swfObject. Dann ist die Veränderung nicht so groß. – Christiaan