2017-03-06 5 views
7

मेरी सागा फ़ाइलों का 100% कवरेज प्राप्त करने के लिए मैं देख रहा हूं कि वॉचर्स का परीक्षण कैसे करें।इकाई परीक्षण redux-saga watchers का बिंदु क्या है?

मैं चारों ओर घूम रहा हूं, ऐसे कई जवाब हैं जो देखने वालों को परीक्षण करने के लिए हैं। यही है, सागा है जो takeEvery या takeLatest करता है।

हालांकि, परीक्षण के सभी तरीके मूल रूप से कार्यान्वयन की प्रतिलिपि बनाने लगते हैं। तो अगर यह वही है तो एक परीक्षा लिखने का क्या मतलब है?

उदाहरण:

// saga.js 

import { delay } from 'redux-saga' 
import { takeEvery, call, put } from 'redux-saga/effects' 
import { FETCH_RESULTS, FETCH_COMPLETE } from './actions' 

import mockResults from './tests/results.mock' 

export function* fetchResults() { 
    yield call(delay, 1000) 
    yield put({ type: FETCH_COMPLETE, mockResults }) 
} 

export function* watchFetchResults() { 
    yield takeEvery(FETCH_RESULTS, fetchResults) 
} 

टेस्ट विधि 1:

import { takeEvery } from 'redux-saga/effects' 
import { watchFetchResults, fetchResults } from '../sagas' 
import { FETCH_RESULTS } from '../actions' 

describe('watchFetchResults()',() => { 
    const gen = watchFetchResults() 
    // exactly the same as implementation 
    const expected = takeEvery(FETCH_RESULTS, fetchResults) 
    const actual = gen.next().value 

    it('Should fire on FETCH_RESULTS',() => { 
     expect(actual).toEqual(expected) 
    }) 
    }) 

टेस्ट विधि 2: एक सहायक के साथ, Redux Saga Test Plan
की तरह यह लेखन का एक अलग तरीका है, लेकिन फिर हम मूल रूप से एक ही है कार्यान्वयन के रूप में।

import testSaga from 'redux-saga-test-plan' 
import { watchFetchResults, fetchResults } from '../sagas' 
import { FETCH_RESULTS } from '../actions' 

it('fire on FETCH_RESULTS',() => { 
    testSaga(watchFetchResults) 
    .next() 
    .takeEvery(FETCH_RESULTS, fetchResults) 
    .finish() 
    .isDone() 
}) 

इसके बजाय मैं बस पता करने के लिए watchFestchResults हर FETCH_RESULTS लेता है, तो चाहते हैं। या यहां तक ​​कि अगर यह takeEvery() आग लगती है। इससे कोई फर्क नहीं पड़ता कि यह कैसे चलता है।

या क्या यह वास्तव में ऐसा करने का तरीका है?

+0

का उपयोग कर उदाहरण हाँ, मैं इस से भी विस्मित कर रहा हूँ। उदाहरण परीक्षण सभी परिणामों को सागा प्रभाव निर्माता के साथ तुलना कर रहे हैं। यही वह नहीं है जिसकी मुझे परवाह है। मुझे इस बात की परवाह है कि क्या वे स्टोर को सही स्थिति में रखते हैं। उदाहरणों का परीक्षण बेहद भंगुर लगता है और कुछ भी साबित नहीं करता है। –

उत्तर

4

ऐसा लगता है कि उनका परीक्षण करने का बिंदु 100% परीक्षण कवरेज प्राप्त करना है।

कुछ चीजें हैं जिन्हें आप यूनिट परीक्षण कर सकते हैं, लेकिन यदि आपको करना चाहिए तो यह संदिग्ध है।

ऐसा लगता है कि यह स्थिति 'एकीकरण' परीक्षण के लिए बेहतर उम्मीदवार हो सकती है। ऐसा कुछ जो केवल एक विधि का परीक्षण नहीं करता है, लेकिन पूरी तरह से कई तरीके एक साथ कैसे काम करते हैं। शायद आप एक ऐसी क्रिया को बुला सकते हैं जो आपके गाथा का उपयोग करने वाले रेड्यूसर को आग लगती है, फिर परिणामी परिवर्तन के लिए स्टोर की जांच करें? अकेले गाथा का परीक्षण करने से यह कहीं अधिक सार्थक होगा।

2

मैं जॉन मेयर के answer से सहमत हूं कि यह इकाई परीक्षण के मुकाबले एकीकरण परीक्षण के लिए बेहतर है। यह issue गिटहब में वोटों के आधार पर सबसे लोकप्रिय है। मैं इसे पढ़ने की सिफारिश करेंगे।

सुझाव में से एक इस मुद्दे के सलामी बल्लेबाज द्वारा बनाए गए redux-saga-tester पैकेज का उपयोग करना है। यह प्रारंभिक स्थिति बनाने में मदद करता है, सागा सहायकों को शुरू करने में मदद करता है (ले लेते हैं, ले लो नवीनतम), गाथाओं को प्रेषित करने वाले कार्यों को प्रेषित करें, राज्य का निरीक्षण करें, कार्यों का इतिहास पुनर्प्राप्त करें और विशिष्ट कार्यों को सुनें।

मैं इसे axios-mock-adapter के साथ उपयोग कर रहा हूं, लेकिन nock का उपयोग कर कोडबेस में कई उदाहरण हैं।

सागा

import { takeLatest, call, put } from 'redux-saga/effects'; 
import { actions, types } from 'modules/review/reducer'; 
import * as api from 'api'; 

export function* requestReviews({ locale }) { 
    const uri = `/reviews?filter[where][locale]=${locale}`; 
    const response = yield call(api.get, uri); 
    yield put(actions.receiveReviews(locale, response.data[0].services)); 
} 

// Saga Helper 
export default function* watchRequestReviews() { 
    yield takeLatest(types.REVIEWS_REQUEST, requestReviews); 
} 

टेस्ट जेस्ट

import { takeLatest } from 'redux-saga/effects'; 
import { types } from 'modules/review/reducer'; 
import SagaTester from 'redux-saga-tester'; 
import MockAdapter from 'axios-mock-adapter'; 
import axios from 'axios'; 

import watchRequestReviews, { requestReviews } from '../reviews'; 

const mockAxios = new MockAdapter(axios); 

describe('(Saga) Reviews',() => { 
    afterEach(() => { 
    mockAxios.reset(); 
    }); 

    it('should received reviews', async() => { 
    const services = [ 
     { 
     title: 'Title', 
     description: 'Description', 
     }, 
    ]; 
    const responseData = [{ 
     id: '595bdb2204b1aa3a7b737165', 
     services, 
    }]; 

    mockAxios.onGet('/api/reviews?filter[where][locale]=en').reply(200, responseData); 

    // Start up the saga tester 
    const sagaTester = new SagaTester({ initialState: { reviews: [] } }); 

    sagaTester.start(watchRequestReviews); 

    // Dispatch the event to start the saga 
    sagaTester.dispatch({ type: types.REVIEWS_REQUEST, locale: 'en' }); 

    // Hook into the success action 
    await sagaTester.waitFor(types.REVIEWS_RECEIVE); 

    expect(sagaTester.getLatestCalledAction()).toEqual({ 
     type: types.REVIEWS_RECEIVE, 
     payload: { en: services }, 
    }); 
    }); 
}); 
संबंधित मुद्दे