带有 nock 和 redux-mock-store 错误的 Redux 动作测试
Redux action testing with nock and redux-mock-store errors
我是 redux 测试的新手,一直在尝试对我制作的应用程序进行回填测试,如果这是用 nock 和 redux-mock-store.[=14= 进行测试的完全错误的方法,我深感抱歉]
//Action in authAction.js
export function fetchMessage() {
return function(dispatch) {
axios.get(ROOT_URL, {
headers: { authorization: localStorage.getItem('token') }
})
.then(response => {
console.log("hi")
dispatch({
type: FETCH_MESSAGE,
payload: response.data.message
});
})
.catch(response => {
console.log(response)
//callingRefresh(response,"/feature",dispatch);
});
}
}
这是方法,它似乎被调用了,但通常会导致 header 不匹配导致诺箭失败的原因。
//authActions_test.js
import nock from 'nock'
import React from 'react'
import {expect} from 'chai'
import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'
const middlewares = [ thunk ]
const mockStore = configureMockStore(middlewares)
import * as actions from '../../src/actions/authActions';
const ROOT_URL = 'http://localhost:3090';
describe('actions', () => {
beforeEach(() => {
nock.disableNetConnect();
localStorage.setItem("token", '12345');
});
afterEach(() => {
nock.cleanAll();
nock.enableNetConnect();
});
describe('feature', () => {
it('has the correct type', () => {
var scope = nock(ROOT_URL).get('/',{reqheaders: {'authorization': '12345'}}).reply(200,{ message: 'Super secret code is ABC123' });
const store = mockStore({ message: '' });
store.dispatch(actions.fetchMessage()).then(() => {
const actions = store.getStore()
expect(actions.message).toEqual('Super secret code is ABC123');
})
});
});
});
即使 header 被移除并且箭尾拦截呼叫。我每次都收到这个错误
TypeError: Cannot read property 'then' of undefined
at Context.<anonymous> (test/actions/authActions_test.js:43:24)
您没有返回 axios 的承诺以链接 then
调用。
将 thunk 更改为:
//Action in authAction.js
export function fetchMessage() {
return function(dispatch) {
return axios.get(ROOT_URL, {
headers: { authorization: localStorage.getItem('token') }
})
.then(response => {
console.log("hi")
dispatch({
type: FETCH_MESSAGE,
payload: response.data.message
});
})
.catch(response => {
console.log(response)
//callingRefresh(response,"/feature",dispatch);
});
}
}
您可能还需要更改测试,使其不会在 promise 解析之前通过。如何执行此操作取决于您使用的测试库。如果您使用的是 mocha,请查看 this answer。
旁注:我不确定您是否有其他单元测试分别测试 action creator 和 reducer,但这是一种非常集成的测试方法。 Redux 的一大优势是可以轻松地相互隔离地测试机器的每个独立齿轮。
我是 redux 测试的新手,一直在尝试对我制作的应用程序进行回填测试,如果这是用 nock 和 redux-mock-store.[=14= 进行测试的完全错误的方法,我深感抱歉]
//Action in authAction.js
export function fetchMessage() {
return function(dispatch) {
axios.get(ROOT_URL, {
headers: { authorization: localStorage.getItem('token') }
})
.then(response => {
console.log("hi")
dispatch({
type: FETCH_MESSAGE,
payload: response.data.message
});
})
.catch(response => {
console.log(response)
//callingRefresh(response,"/feature",dispatch);
});
}
}
这是方法,它似乎被调用了,但通常会导致 header 不匹配导致诺箭失败的原因。
//authActions_test.js
import nock from 'nock'
import React from 'react'
import {expect} from 'chai'
import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'
const middlewares = [ thunk ]
const mockStore = configureMockStore(middlewares)
import * as actions from '../../src/actions/authActions';
const ROOT_URL = 'http://localhost:3090';
describe('actions', () => {
beforeEach(() => {
nock.disableNetConnect();
localStorage.setItem("token", '12345');
});
afterEach(() => {
nock.cleanAll();
nock.enableNetConnect();
});
describe('feature', () => {
it('has the correct type', () => {
var scope = nock(ROOT_URL).get('/',{reqheaders: {'authorization': '12345'}}).reply(200,{ message: 'Super secret code is ABC123' });
const store = mockStore({ message: '' });
store.dispatch(actions.fetchMessage()).then(() => {
const actions = store.getStore()
expect(actions.message).toEqual('Super secret code is ABC123');
})
});
});
});
即使 header 被移除并且箭尾拦截呼叫。我每次都收到这个错误
TypeError: Cannot read property 'then' of undefined
at Context.<anonymous> (test/actions/authActions_test.js:43:24)
您没有返回 axios 的承诺以链接 then
调用。
将 thunk 更改为:
//Action in authAction.js
export function fetchMessage() {
return function(dispatch) {
return axios.get(ROOT_URL, {
headers: { authorization: localStorage.getItem('token') }
})
.then(response => {
console.log("hi")
dispatch({
type: FETCH_MESSAGE,
payload: response.data.message
});
})
.catch(response => {
console.log(response)
//callingRefresh(response,"/feature",dispatch);
});
}
}
您可能还需要更改测试,使其不会在 promise 解析之前通过。如何执行此操作取决于您使用的测试库。如果您使用的是 mocha,请查看 this answer。
旁注:我不确定您是否有其他单元测试分别测试 action creator 和 reducer,但这是一种非常集成的测试方法。 Redux 的一大优势是可以轻松地相互隔离地测试机器的每个独立齿轮。