我如何测试商店单身人士?

时间:2017-01-10 10:34:06

标签: javascript reactjs react-native redux jestjs

我已经使用redux-mock-store实现了单元测试。

我想在一个使用商店单例的反应原生应用程序上执行集成测试套件。然而,即使console.log达到reducer函数(并且似乎工作正常),商店上的状态也不会改变。

// __tests__/things.js
jest.mock('../app/store')
import 'react-native'

import * as selectors from '../app/selectors'
import * as sagas from '../app/sagas'
import { store } from '../app/store'

describe('Things', () => {
  it('should toggle', async () => {
    const previousCounter = selectors.count()
    await sagas.increment()
    expect(store.getState().count).toEqual(previousCounter)
  })
})

同时模拟商店的实施:

// __mocks__
import { createStore } from 'redux'
import rootReducer from '../reducers'
export const store = createStore(rootReducer, {})

编辑:样本减速器

// app/reducers.js 
function rootReducer (state = { count: 0 }, action = {}) {
    const count = state.count + 1
    return { ...state, count }
}

一切都很好,但国家不会改变。如果我通过订阅商店来实现观察者,我会看到正在调度的动作系列。

1 个答案:

答案 0 :(得分:0)

我会回答我的问题,作为其他人处理这种诡计的手段。

与许多其他教程和指南一样,不鼓励商店单身人士。我理解的是隔离依赖关系和组件。但是,如果您仍然决定使用它来提供舒适性 - 我们这样做 - 您需要在需要时从其他deps模拟组件,因为它们不会被递归模拟。

因此,与此类似的文件夹结构......

.
├── app
|    ├── __mocks__
|    |    |
|    |    └── store.js
|    └── store.js

对于那些同时需要“./store.js”的deps,您需要导出模拟版本。

// app/store.js

// Choose mock dependency over current store for tests
if (process.env.NODE_ENV === 'test') {
  jest.mock('./store')
}

这样,只要在测试期间需要store.js,它就会以递归方式选择模拟版本而不是真实版本。

可能存储单身人士需要更多的倡导才能被选为主流的redux练习。不应被视为反模式。