2017-01-10 8 views
1

Ich implementiere bereits Unit Tests mit redux-mock-store.Wie kann ich einen Store Singleton testen?

Ich möchte eine Integrationstest-Suite auf einer reaktiven nativen App ausführen, die Store-Singletons problemlos verwendet. Obwohl console.log s bis zur Reducer-Funktion reichen (und scheinbar korrekt funktionieren), ändert sich der Status des Speichers nicht.

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

Inzwischen ist die Scheinspeicherimplementierung:

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

EDIT: Eine Probe Minderer

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

Alles funktioniert gut, aber der Staat nicht ändert. Wenn ich einen Beobachter durch das Abonnieren des Geschäfts implementiere, sehe ich, dass die Aktionsreihe versandt wird.

+0

Sie sollten Ihren Reduzierer auch zeigen. – zurfyx

+0

Fertig, ich habe eine Probe hinzugefügt. Aber auf der realen Codebasis, wie ich sage, funktionieren Reduktoren wie erwartet. Es ist so, wie sie Änderungen im "anderen" Geschäft speichern, eher im verspotteten Singleton. – jsdario

+0

Scheint so, als ob dein Mock Store nicht mit Sagas verbunden ist. So ruft 'sagas.increment' keinen Effekt auf den Laden auf. –

Antwort

0

Ich beantworte meine Frage als Mittel für andere, um an dieser Kasuistik zu arbeiten.

Wie in vielen anderen Tutorials und Anleitungen, Store Singletons werden abgeraten. Was ich verstehe, ist eine Frage der Isolierung von Abhängigkeiten und Komponenten. Wenn Sie sich jedoch dennoch für den Komfort entscheiden - wie wir es tun - müssen Sie die Komponente bei Bedarf aus anderen Depots verspotten, da sie rekursiv nicht verspottet werden.

Also abgesehen Form dies ein ähnliches zu haben, Ordnerstruktur ...

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

Sie werden die verspottet Version exportieren müssen, für diejenigen, die deps ‚./store.js' zum gleichen erfordern Zeit.

// app/store.js 

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

Auf diese Weise, wenn store.js während der Tests erforderlich ist, wird es die Mock-Version über die reale rekursiv wählen.

Wahrscheinlich speichern Singletons ein wenig mehr Advocacy, um als Mainstream-Redux-Praxis gewählt werden. Sollte nicht als ein Anti-Muster betrachtet werden.

Verwandte Themen