【发布时间】:2021-05-02 03:45:09
【问题描述】:
我有一个名为SearchBox 的组件,它在SearchSection 中使用,而MyComponent 又使用它。 SearchBox 有一个使用setTimeout() 的方法。
SearchBox.tsx
import React from 'react';
export class SearchBox extends React.Component {
private timer: (ReturnType<typeof setTimeout> | null) = null;
public asyncmethod() {
if (this.timer !== null) {
clearTimeout(this.timer);
}
this.timer = setTimeout(() => {
doSomething();
}, 1000);
console.log('using original class method');
}
render() {
return (
<div>
...
...
{this.asyncmethod()}
...
...
</div>
);
}
}
SearchSection.tsx
import React from 'react';
import { SearchBox } from './SearchBox';
export class SearchSection extends React.Component {
render() {
return <SearchBox />;
}
}
MyComponent.tsx
import React from 'react';
import { SearchSection } from './SearchSection';
export class MyComponent extends React.component {
render() {
return <SearchSection />;
}
}
现在我想使用react-testing-library 测试MyComponent,并且我想使用不使用setTimeout 的重写类方法来模拟SearchBox。我尝试了以下
testUtil.tsx
import { SearchBox } from './SearchBox';
class MockedSearchBox extends SearchBox {
public asyncMethod() {
doSomething();
console.log('using mocked class method');
}
}
MyComponent.test.tsx
import { MockedSearchBox } from './testUtil.tsx'
import { render } from '@testing-library/react';
import { MyComponent } from './MyComponent';
describe('My component', () => {
jest.mock('./SearchBox', () => {
return {
SearchBox: MockedSearchBox
}
});
test('that my component shows text', () => {
const { getByText } = render(<MyComponent />);
expext(getByText('Search mock text')).toBeDefined();
});
});
但这不起作用。即使在编写了上述代码之后,也会调用原始类方法。我做错了什么?
【问题讨论】:
标签: reactjs typescript unit-testing jestjs react-testing-library