4e05f89413
This is largely a straight-forward copy of the Karma spec, with the usual Karma->Jest necessary changes. This also fixes a bug in the implementation that was causing the tests to fail, when run on Jest/node, whereby actions that return rejected promises would always fail the given test. This was due to those rejections not being caught in the same call stack in which they were created.
101 lines
2.3 KiB
JavaScript
101 lines
2.3 KiB
JavaScript
const noop = () => {};
|
|
|
|
/**
|
|
* Helper for testing action with expected mutations inspired in
|
|
* https://vuex.vuejs.org/en/testing.html
|
|
*
|
|
* @param {Function} action to be tested
|
|
* @param {Object} payload will be provided to the action
|
|
* @param {Object} state will be provided to the action
|
|
* @param {Array} [expectedMutations=[]] mutations expected to be committed
|
|
* @param {Array} [expectedActions=[]] actions expected to be dispatched
|
|
* @param {Function} [done=noop] to be executed after the tests
|
|
* @return {Promise}
|
|
*
|
|
* @example
|
|
* testAction(
|
|
* actions.actionName, // action
|
|
* { }, // mocked payload
|
|
* state, //state
|
|
* // expected mutations
|
|
* [
|
|
* { type: types.MUTATION}
|
|
* { type: types.MUTATION_1, payload: expect.any(Number)}
|
|
* ],
|
|
* // expected actions
|
|
* [
|
|
* { type: 'actionName', payload: {param: 'foobar'}},
|
|
* { type: 'actionName1'}
|
|
* ]
|
|
* done,
|
|
* );
|
|
*
|
|
* @example
|
|
* testAction(
|
|
* actions.actionName, // action
|
|
* { }, // mocked payload
|
|
* state, //state
|
|
* [ { type: types.MUTATION} ], // expected mutations
|
|
* [], // expected actions
|
|
* ).then(done)
|
|
* .catch(done.fail);
|
|
*/
|
|
export default (
|
|
action,
|
|
payload,
|
|
state,
|
|
expectedMutations = [],
|
|
expectedActions = [],
|
|
done = noop,
|
|
) => {
|
|
const mutations = [];
|
|
const actions = [];
|
|
|
|
// mock commit
|
|
const commit = (type, mutationPayload) => {
|
|
const mutation = { type };
|
|
|
|
if (typeof mutationPayload !== 'undefined') {
|
|
mutation.payload = mutationPayload;
|
|
}
|
|
|
|
mutations.push(mutation);
|
|
};
|
|
|
|
// mock dispatch
|
|
const dispatch = (type, actionPayload) => {
|
|
const dispatchedAction = { type };
|
|
|
|
if (typeof actionPayload !== 'undefined') {
|
|
dispatchedAction.payload = actionPayload;
|
|
}
|
|
|
|
actions.push(dispatchedAction);
|
|
};
|
|
|
|
const validateResults = () => {
|
|
expect({
|
|
mutations,
|
|
actions,
|
|
}).toEqual({
|
|
mutations: expectedMutations,
|
|
actions: expectedActions,
|
|
});
|
|
done();
|
|
};
|
|
|
|
const result = action(
|
|
{ commit, state, dispatch, rootState: state, rootGetters: state, getters: state },
|
|
payload,
|
|
);
|
|
|
|
return (result || new Promise(resolve => setImmediate(resolve)))
|
|
.catch(error => {
|
|
validateResults();
|
|
throw error;
|
|
})
|
|
.then(data => {
|
|
validateResults();
|
|
return data;
|
|
});
|
|
};
|