Я пытаюсь протестировать селектор реагирования / повторного выбора, который будет фильтровать массив и возвращать только активных клиентов. Моя проблема связана с immutableJS.
Селектор:
const selectClients = state => state.get('clients', initialState)
const makeSelectInactiveClients = () => createSelector(
makeSelectClients(),
clients => clients.filter(c => c.inactive)
)
Тест:
describe('Active and not active client selectors', () => {
const activeClients = [
{ id: 1, name: 'Client 1' },
{ id: 2, name: 'Client 2' },
]
const inactiveClients = [
{ id: 1, name: 'Client 3', inactive: true },
{ id: 2, name: 'Client 4', inactive: true },
]
const clients = [
{ id: 1, name: 'Client 1' },
{ id: 2, name: 'Client 2' },
{ id: 1, name: 'Client 3', inactive: true },
{ id: 2, name: 'Client 4', inactive: true },
]
describe('#makeSelectActiveClients', () => {
const activeClientsSelector = selectors.makeSelectActiveClients()
it('only returns active clients', () => {
const mockedState = fromJS({
clients: {
loading: false,
clients: clients,
},
})
expect(activeClientsSelector(mockedState)).toEqual(activeClients)
})
})
})
Разбавление:
export default function ClientsReducer(state = initialState, action) {
switch (action.type) {
case FETCH_CLIENTS:
return state.set('loading', true)
case SET_CLIENTS:
return state
.set('loading', false)
.set('clients', action.clients)
default:
return state
}
}
Проблема в том, что когда редуктор устанавливает клиентский массив, он устанавливает план JS-массива. Однако, когда этот массив установлен в моем тесте с использованием ImmutableJS, он устанавливается как неизменный объект и не имеет неактивного объекта без использования ключевого слова get.
Должен ли я звонить toJS в моем редукторе, как это?
return state
.set('loading', false)
.set('clients', fromJS(action.clients))
, а затем использовать ключевое слово get в селекторах для доступа к свойствам объектов-членов клиентов?
или я должен что-то делать по-другому в моем тесте?