变量不在单元测试中更新

时间:2017-06-19 02:21:42

标签: angular unit-testing typescript jasmine redux

我正在进行单元测试,我想测试一下redux商店中的值是否根据我的指示更新。

我的module reducer单元测试包含多个测试套件,有些正在更新状态,有些则没有,我也不知道为什么......所以我经过一天的测试和研究后来到这里看看如果有人可能知道我的错误的原因。任何建议都表示赞赏。

以下是我的模块缩减器代码的一部分:

export function createModuleReducer() {
  return function moduleReducer(state: PageModules = INITIAL_STATE,
    action): PageModules {
      if (!action.meta || !action.meta.status) {
        return state;
      }
      switch (action.type) {
        case INITIALIZE:

        case CREATE_SIGNATURES_ARRAY:
          return tassign(state, {signatures: action.payload['document']});

以下是我的模块reducer规范代码的一部分:

const baseState = {
  signatures: []
};
let state;
…
describe('Reducer', () => {
  …
  beforeEach(async(() => {
    TestBed.configureTestingModule({
    …
    MockNgRedux.reset();
    state = JSON.parse(JSON.stringify(baseState));
  }));

  it('should call CREATE_SIGNATURES_ARRAY reducer', async(() => {
    const actionCreateSignature = {
      type: CREATE_SIGNATURES_ARRAY,
      meta: { status: 'create_signature'},
      payload: { 'document': … }
    };
    createModuleReducer()(state, actionCreateSignature);
    mockNgRedux.dispatch(actionCreateSignature);
    expect(state.signatures).toEqual(…)
  }));
}

使用console.log,我知道module reducer会相应地更新商店,但规范中的值不会改变。

2 个答案:

答案 0 :(得分:0)

减速器应该是最容易测试的部件,因为它们是纯粹的功能 根据您实施减速机的方式,您可能不需要TestBed 你也可能不需要MockNgRedux。我只在使用@select的组件的测试中使用它。

传递给reducer的状态应该只是reducer负责的片段,在这种情况下是signatures属性吗?所以也许你的测试应该是

createModuleReducer()(state.signatures, actionCreateSignature);

我还建议在你预期之前加上console.log(state),以了解减速机如何处理它。

要提供进一步的建议,需要了解有关createModuleReducer()方法的更多信息 此外,mockNgRedux.dispatch()看起来不正确。我看到的所有电话都是静态的 M ockNgRedux(该类)。

答案 1 :(得分:0)

问题已解决,感谢Richard Matsen和redux关于测试减速器的文档的建议!

我现在直接测试createModuleReducer:

expect(createModuleReducer()(state, actionCreateSignature).signatures).toEqual(…)