testing - Chai 的 Redux 测试问题

标签 testing redux mocha.js chai

我正在学习 react redux,我目前正在使用 TDD 实现一些 reducer。我正在使用示例应用程序,它只是一个用于添加/删除/打开/关闭注释的记事本。

我正在做一些添加新笔记的测试,但是第二个“它”失败了,抛出的错误如下:

1) AddNote reducer 应该返回两个注释: AssertionError:预期 { Object (id-123, id-456) } 等于 { Object (byId, ids, ...) }

describe('AddNote reducer' , () => {
    it('should return a new note', () => {
        const state = getMockState.withNoNotes();
        const actualNextState = reducers.byId(
            state.byId, actions.addNote(
                'Hello World', 'id-123', 1));
        const expectedNextState = {
            'id-123': {
                id: 'id-123',
                content: 'Hello World',
                timestamp: 1
            }
        };
        expect(actualNextState).to.deep.equal(expectedNextState);
    });

    it('should return two notes', () => {
        const state = getMockState.withOneNote();
        const actualNextState = reducers.byId(state.byId, actions.addNote('Bye bye world!', 'id-456', 2));
        const expectedNextState = {
            ...state,
            'id-456': {
                id: 'id-456',
                content: 'Bye bye world!',
                timestamp: 2
            }
        };
        expect(actualNextState).to.deep.equal(expectedNextState);
    });
});

我也在使用一个助手,就在这里

export const getMockState = {
    withNoNotes: () => ({
        byId: {},
        ids: [],
        openNoteId: null,
    }),
    withOneNote: () => ({
        byId: {
            'id-123': {
                id: 'id-123',
                content: 'Hello world',
                timestamp: 1,
            },
        },
        ids: ['id-123'],
        openNoteId: 'id-123',
    }),
};

我的想法是,如果我在第一种情况下添加一个音符,它会返回一个只有该音符的新状态,但在第二种情况下,它应该返回一个包含前一个音符的状态,加上新的状态。 我正在使用带有 mocha 的 Chai expect 库。

如果有帮助,这里是状态输出(它是控制台日志),我认为没问题,

{ 'id-123': { id: 'id-123', content: 'Hello World', timestamp: 1 } }
    √ should return a new note
{ 'id-123': { id: 'id-123', content: 'Hello world', timestamp: 1 },
  'id-456': { id: 'id-456', content: 'Bye bye world!', timestamp: 2 } }
    1) should return two notes

这是我的 reducer

import { merge } from 'ramda';

export const byId = (state={}, {type, payload}) => {
    switch(type) {
        case 'app/addNote':
            console.log(merge(state, { [payload.id]: payload})) ;
            return merge(state, { [payload.id]: payload});
        default:
            return state;
    }
};

有什么想法吗?提前致谢!

最佳答案

您的expectedState 不正确。您正在比较 byId 切片的“下一个状态”,但是您的 expectedNextState 扩展了整个状态。它实际上应该是:

const expectedNextState = {
    ...state.byId,
    'id-456': {
        id: 'id-456',
        content: 'Bye bye world!',
        timestamp: 2
    }
};

关于testing - Chai 的 Redux 测试问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42613366/

相关文章:

testing - Mockito spy 不起作用

angular - 在 Angular(typescript) 中使用 tassign 的 Redux 试图加入 state.array 和 action.array 但获取 state.array.join 不是一个函数?

mocha.js - 如何使用 Mocha TDD koa2?

testing - cucumber 之前和之后的钩子(Hook)在哪里

haskell - 使用 Haskell 的 Quickcheck 检查传递性

unit-testing - 编写测试时如何处理setUp()成瘾问题?

javascript - 如何从 react-redux 中的 Promise 对象获取普通的 json 对象

javascript - 在动态 block React 中对父元素使用 ref

node.js - 即使断言失败,Mocha 测试也会通过

javascript - 如何在nodejs中解析 "Error: invalid reporter "html-cov""