私のテストは、この(this articleをオフに基づいて)のように見えるテスト:変数のスコープの問題反応成分の
// MyComponent.test.js
import { mount } from 'enzyme';
import MyComponent from './MyComponent.jsx';
describe('<MyComponent />',() => {
let props;
let state;
let mountedComponent;
// The problematic part to be changed
const component =() => {
if (!mountedComponent) {
// This enzyme mount is actually much more complex,
// as I'm wrapping all sorts of contexts and globals around it
// which is why I want to take this function outside,
// and use it as boilerplate in every test
mountedComponent = mount(<MyComponent {...props} />);
}
return mountedComponent;
};
beforeEach(() => {
props = {};
state = {};
mountedComponent = undefined;
});
it('Works',() => {
state = { val: true };
component().setState(state,
() => expect(component().state('val')).to.equal(true),
);
});
});
これはうまく機能で複数回呼び出された場合、component()
機能が適切同じmountedComponent
を返します同じit
は、mountedComponentの現在の値が呼び出しの間保持され、beforeEachテストのみをリセットします。
今、私は別のファイルにこのテストの外component()
機能を抽出した場合:理由はコンポーネント()、そして、このこのテストが失敗
// MyComponent.test.js
// Cleaner problematic part
const component =() => getMountedComponent(MyComponent, props, mountedComponent);
:
// getMountedComponent.js
const getMountedComponent = (AnyComponent, props, mountedComponent) => {
if (!mountedComponent) {
// Appears not to properly reassign mountedComponent
mountedComponent = mount(<AnyComponent {...props} />);
}
return mountedComponent;
};
そして、これとcomponent()
機能を置き換えますstate = nullで2回目に新しいコンポーネントを返します。
これは範囲の問題として表示されますが、私はこれを回避することはできません。
私はdescribe関数から関数を抜き出しているのは、実際に説明したものよりも少し複雑だからです。つまり、 'getMountedComponent'を別のファイルに保存したいということです。 –
更新された回答を確認してください。 –
美しい!それは働いた:) 私はすぐにこれを使用して関数を書いた: 'getMountedComponent.reset =()=> {delete getMountedComponent.mountedComponent; } ' –