【发布时间】:2017-01-30 17:29:55
【问题描述】:
我使用create-app-component 创建了一个项目,它使用构建脚本(babel、webpack、jest)配置了一个新应用程序。
我编写了一个我正在尝试测试的 React 组件。该组件需要另一个 javascript 文件,公开一个函数。
我的 search.js 文件
export {
search,
}
function search(){
// does things
return Promise.resolve('foo')
}
我的反应组件:
import React from 'react'
import { search } from './search.js'
import SearchResults from './SearchResults'
export default SearchContainer {
constructor(){
this.state = {
query: "hello world"
}
}
componentDidMount(){
search(this.state.query)
.then(result => { this.setState({ result, })})
}
render() {
return <SearchResults
result={this.state.result}
/>
}
}
在我的单元测试中,我想检查方法 search 是否使用正确的参数调用。
我的测试看起来像这样:
import React from 'react';
import { shallow } from 'enzyme';
import should from 'should/as-function';
import SearchResults from './SearchResults';
let mockPromise;
jest.mock('./search.js', () => {
return { search: jest.fn(() => mockPromise)};
});
import SearchContainer from './SearchContainer';
describe('<SearchContainer />', () => {
it('should call the search module', () => {
const result = { foo: 'bar' }
mockPromise = Promise.resolve(result);
const wrapper = shallow(<SearchContainer />);
wrapper.instance().componentDidMount();
mockPromise.then(() => {
const searchResults = wrapper.find(SearchResults).first();
should(searchResults.prop('result')).equal(result);
})
})
});
我已经很难弄清楚如何使jest.mock 工作,因为它需要以mock 为前缀的变量。
但如果我想测试 search 方法的参数,我需要在我的测试中提供模拟函数。
如果我转换模拟部分,使用变量:
const mockSearch = jest.fn(() => mockPromise)
jest.mock('./search.js', () => {
return { search: mockSearch};
});
我收到此错误:
TypeError: (0 , _search.search) 不是函数
无论我尝试访问jest.fn 并测试参数,我都无法使其工作。
我做错了什么?
【问题讨论】:
标签: javascript unit-testing reactjs mocking jestjs