我怎样才能更好地测试使用电子的actionCreator

时间:2018-03-12 08:45:25

标签: reactjs redux electron jestjs

这是一个动作样本示例。它会分离正确的操作,然后尝试将已在商店中更新的数据保存到文件系统(这是一个电子应用程序)。

一切正常,但我对测试动作创建者有疑问。

...

function persistClasses(dispatch: Function, getState: Function, callback: Function) {
  writeAppData(
    {
      [FILE_CLASSES]: JSON.stringify({[CLASSES]: getState()[CLASSES]})
    },
    (ioResult: Object) => {
      if (ioResult.success) {
        dispatch(persitingDataSuccess(CLASSES));
      } else {
        dispatch(persitingDataError(CLASSES));
      }

      callback(ioResult);
    }
  );
}

export function replaceClasses(updatedData: Array<Object>, callback: Function): ActionObj {
  return (dispatch, getState) => {
    dispatch({
      type: REPLACE_CLASSES,
      payload: updatedData,
    });

    persistClasses(dispatch, getState, callback);
  };
}

...


function writeAppData(content: Object, callback: Function) {
  let files = DATA_PATHS.filter(filePath => content[filePath] !== undefined)
    .map(filePath => {
       return new Promise((resolve, reject) => {
       const FILE_PATH = getFilePath(filePath);

      fs.writeFile(FILE_PATH, content[filePath], 'UTF-8', (err?: any) => {
        if (err) {
          reject(err);
        } else {
          resolve(FILE_PATH);
        }
      });
  });
});

  Promise.all(files)
.then(
  responses => {
    callback({
      success: true,
      errorObj: null,
    });
  }
)
.catch(
  err => {
    callback({
      success: false,
      errorObj: err,
    });
  }
);
}

...

以下测试有效,但它只测试我的replaceClasses操作中发生的事情。

如何测试persistClasses的功能?

import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk';
import * as classActions from '../classActions';
import { REPLACE_CLASSES, UPDATE_CLASS, ADD_CLASS, DELETE_ALL_CLASSES } from '../../constants/actionTypes';
import ClassDefault from '../../types/class';

const middlewares = [thunk];
const mockStore = configureMockStore(middlewares);


/**
* Class Actions Tests
*/

describe('Actions: classActions:', () => {
  let testClass = {};
  let callback = function(){};
  let store = function(){};

  beforeEach(() => {
    testClass = {...ClassDefault, id: 'c1', label: 'Class'};
    callback = jest.fn();
    store = mockStore({ classes: [] });
  });

  test('replaceClasses dispatches the correct action', () => {
    const EXPECTED_ACTIONS = [
      { type: REPLACE_CLASSES, payload: [testClass] },
    ];

    store.dispatch(classActions.replaceClasses([testClass], callback));
    expect(store.getActions()).toEqual(EXPECTED_ACTIONS);
  });

  ...

 });

我不确定我是否需要测试它,因为它只使用电子的I / O方法,我认为这些方法将被电子自己的测试所覆盖。或者在那里我可以测试一下吗?我不认为可以获得电子的测试环境。

1 个答案:

答案 0 :(得分:0)

我想到了两种方式:

按作文

使replaceClasses函数接受一个名为writeDataFn的函数参数。然后在你的测试中你可以传递一个间谍并检查它是否用适当的参数调用。

使用proxyquire

https://github.com/thlorenz/proxyquire

感谢这个模块,你可以import模拟一些依赖项的模块。例如:

const classActions = proxyquire('../classActions, { writeAppData: () => 'I'm a spy!' });

顺便说一下 - 我强烈建议在开发中使用TDD方法 - 你不会遇到像这样的问题:) https://en.wikipedia.org/wiki/Test-driven_development