2017-01-10 1 views
1

redux-mock-store을 사용하여 단위 테스트를 이미 구현하고 있습니다.저장소 싱글 톤을 테스트하려면 어떻게해야합니까?

저장소 싱글 톤을 잘 사용하는 반응식 응용 프로그램에서 통합 테스트를 수행하고 싶습니다. 그러나 console.log이 감속기 기능까지 도달해도 (그리고 제대로 작동하는 것처럼 보이지만) 저장소의 상태는 변경되지 않습니다.

// __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 } 
} 

모든 것이 잘 작동하지만, 상태는 변경되지 않습니다. 저장소에 가입하여 옵저버를 구현하면 작업 시리즈가 전달되는 것을 볼 수 있습니다.

+0

감속기도 함께 보여야합니다. – zurfyx

+0

완료, 샘플을 추가했습니다. 그러나 실제 코드베이스에서는 감속기가 예상대로 작동한다고 말합니다. 그것들은 조롱 된 싱글 톤보다는 "다른"저장소에 대한 변화를 저장하고 있기 때문입니다. – jsdario

+0

모의 상점이 무용담과 연결되어 있지 않은 것 같습니다. 따라서'sagas.increment'를 호출해도 상점에 아무런 영향을 미치지 않습니다. –

답변

0

저는이 질문에 대한 답변을 다른 사람들이이 캐슈 스틱에 적용 할 수 있도록 해줄 것입니다.

다른 많은 자습서 및 가이드와 마찬가지로 저장소 싱글 톤은 권장하지 않습니다. 내가 이해할 수있는 것은 종속성과 구성 요소를 격리해야한다는 것입니다. 그러나 여전히 편안함을 위해 사용하기로 결정한 경우 재귀 적으로 조롱하지 않으므로 다른 deps에서 필요할 때 구성 요소를 조롱해야합니다.

그래서 떨어져 양식이, 폴더 구조와 유사한를 가진 ...

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

당신은 같은에서 './store.js'이 필요한 deps를 들어, 조롱 버전을 수출해야합니다 시각. store.js이 시험 중에 필요할 때마다

// app/store.js 

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

이 방법은, 그것은 반복적으로 진짜을 통해 모의 버전을 선택합니다.

아마 singletons를 저장하려면 주류의 redux 관행으로 선택해야합니다. 반 패턴으로 간주되어서는 안됩니다.

관련 문제