我的一个反应成分的测试看起来是这样的(根据关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的当前值在调用之间被保留,并且只在每次测试之前重置。
现在,如果我提取component()
功能本次测试外到另一个文件:
// getMountedComponent.js
const getMountedComponent = (AnyComponent, props, mountedComponent) => {
if (!mountedComponent) {
// Appears not to properly reassign mountedComponent
mountedComponent = mount(<AnyComponent {...props} />);
}
return mountedComponent;
};
而更换component()
功能与此:
// MyComponent.test.js
// Cleaner problematic part
const component =() => getMountedComponent(MyComponent, props, mountedComponent);
那么这个测试失败,因为成分()第二次返回一个新组件,其中state = null。
它似乎是一个范围问题,但我不能包裹我的头?
我从描述函数中抽取函数的原因是因为它实际上比我解释的要复杂一些。这意味着我想'getMountedComponent'生活在另一个文件中。 –
请检查更新的答案。 –
美丽!它的工作:) 我立即用它来写一个函数:'getMountedComponent.reset =()=> {delete getMountedComponent.mountedComponent; }' –