redux 单元测试 Store.dispatch()
redux unit testing Store.dispatch()
我有一个像这样的基本反应组件。
import React from 'react';
import store from 'src/home/store';
class PageLoading extends React.Component {
constructor(props) {
super(props);
this.state = {
message: this.props.message
};
}
componentDidMount(){
store.dispatch({ type: 'SET_NOTIFICATION_DIALOG', status: '200', message: this.state.message, model: 'LOADING' });
}
render(){
return(<div />);
}
}
export default PageLoading;
如何单元化这个组件..?
我正在使用 karma 和 ezyme。
我在下面写了这段代码,但这不起作用
import configureMockStore from 'redux-mock-store';
import PageLoading from 'src/home/components/PageLoading';
const middlewares = [];
const mockStore = configureMockStore(middlewares);
Enzyme.configure({ adapter: new Adapter() });
describe("Page Loading",()=>{
it("testing shoul dispatch action on calling componentdid mount",()=>{
const initialState = {}
const store = mockStore(initialState)
const wrapper = mount(<PageLoading message="loading"/>);
const actions = store.getActions();
const expectedPayload = {type: 'SET_NOTIFICATION_DIALOG', status: '200', message:"loading", model: 'LOADING' };
expect(actions).toEqual([expectedPayload])
})
})
我认为它没有得到商店。
试试这个:
it("testing shoul dispatch action on calling componentdid mount",()=>{
const initialState = {}
const store = mockStore(initialState)
const wrapper = mount(<PageLoading message="loading"/>);
const actions = store.getActions();
const expectedPayload = {type: 'SET_NOTIFICATION_DIALOG', status: '200', message:"loading", model: 'LOADING' };
spyOn(store, 'dispatch');
expect(store.dispatch).toHaveBeenCalledWith([expectedPayload]);
})
如果它不能与 spy on store 一起使用,请尝试 spy on mockedstore 和 mockedstore.dispatch
首先,你应该provide the store at the top of your app heirarchy。
使用 connect
连接到商店并在您的组件道具中注入 dispatch
:
import React from 'react';
import { connect } from 'react-redux';
class PageLoading extends React.Component {
constructor(props) {
super(props);
this.state = {
message: this.props.message
};
}
componentDidMount(){
this.props.dispatch({ type: 'SET_NOTIFICATION_DIALOG', status: '200', message: this.state.message, model: 'LOADING' });
}
render(){
return(<div />);
}
}
export default connect()(PageLoading);
在您的测试中,您可以通过将其作为道具传递来替换已连接组件的商店:
describe("Page Loading",()=>{
it("testing shoul dispatch action on calling componentdid mount",()=>{
const initialState = {}
const store = mockStore(initialState)
const wrapper = mount(<PageLoading store={store} message="loading"/>);
const actions = store.getActions();
const expectedPayload = {type: 'SET_NOTIFICATION_DIALOG', status: '200', message:"loading", model: 'LOADING' };
expect(actions).toEqual([expectedPayload])
})
})
我有一个像这样的基本反应组件。
import React from 'react';
import store from 'src/home/store';
class PageLoading extends React.Component {
constructor(props) {
super(props);
this.state = {
message: this.props.message
};
}
componentDidMount(){
store.dispatch({ type: 'SET_NOTIFICATION_DIALOG', status: '200', message: this.state.message, model: 'LOADING' });
}
render(){
return(<div />);
}
}
export default PageLoading;
如何单元化这个组件..?
我正在使用 karma 和 ezyme。 我在下面写了这段代码,但这不起作用
import configureMockStore from 'redux-mock-store';
import PageLoading from 'src/home/components/PageLoading';
const middlewares = [];
const mockStore = configureMockStore(middlewares);
Enzyme.configure({ adapter: new Adapter() });
describe("Page Loading",()=>{
it("testing shoul dispatch action on calling componentdid mount",()=>{
const initialState = {}
const store = mockStore(initialState)
const wrapper = mount(<PageLoading message="loading"/>);
const actions = store.getActions();
const expectedPayload = {type: 'SET_NOTIFICATION_DIALOG', status: '200', message:"loading", model: 'LOADING' };
expect(actions).toEqual([expectedPayload])
})
})
我认为它没有得到商店。
试试这个:
it("testing shoul dispatch action on calling componentdid mount",()=>{
const initialState = {}
const store = mockStore(initialState)
const wrapper = mount(<PageLoading message="loading"/>);
const actions = store.getActions();
const expectedPayload = {type: 'SET_NOTIFICATION_DIALOG', status: '200', message:"loading", model: 'LOADING' };
spyOn(store, 'dispatch');
expect(store.dispatch).toHaveBeenCalledWith([expectedPayload]);
})
如果它不能与 spy on store 一起使用,请尝试 spy on mockedstore 和 mockedstore.dispatch
首先,你应该provide the store at the top of your app heirarchy。
使用 connect
连接到商店并在您的组件道具中注入 dispatch
:
import React from 'react';
import { connect } from 'react-redux';
class PageLoading extends React.Component {
constructor(props) {
super(props);
this.state = {
message: this.props.message
};
}
componentDidMount(){
this.props.dispatch({ type: 'SET_NOTIFICATION_DIALOG', status: '200', message: this.state.message, model: 'LOADING' });
}
render(){
return(<div />);
}
}
export default connect()(PageLoading);
在您的测试中,您可以通过将其作为道具传递来替换已连接组件的商店:
describe("Page Loading",()=>{
it("testing shoul dispatch action on calling componentdid mount",()=>{
const initialState = {}
const store = mockStore(initialState)
const wrapper = mount(<PageLoading store={store} message="loading"/>);
const actions = store.getActions();
const expectedPayload = {type: 'SET_NOTIFICATION_DIALOG', status: '200', message:"loading", model: 'LOADING' };
expect(actions).toEqual([expectedPayload])
})
})