【问题标题】:How can I better test an actionCreator that uses electrons如何更好地测试使用电子的 actionCreator
【发布时间】:2018-03-12 08:45:24
【问题描述】:

这是一个示例 actioncreator。它分发正确的操作,然后尝试将存储中已更新的数据持久保存到文件系统(这是一个电子应用程序)。

一切正常,但我有一个关于测试动作创建者的问题。

...

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 方法,我认为电子自己的测试将涵盖这些方法。或者有没有我可以测试它?我不认为这是可以访问电子的测试环境。

【问题讨论】:

    标签: reactjs redux electron jestjs


    【解决方案1】:

    我想到了两种方法:

    按组成

    使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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      相关资源
      最近更新 更多