2016-09-10 179 views
0

編寫測試我測試下面的傳奇功能的終極版,傳奇

export function* fetchMessages(channel) { 
    yield put(requestMessages()) 
    const channel_name = channel.payload 
    try { 
     const response = yield call(fetch,'/api/messages/'+channel_name) 

     if(response.ok){ 
      const res = yield response.json(); 

      const date = moment().format('lll'); 
      yield put(receiveMessages(res,channel.payload,date)) 
     } 


    } catch (error){ 
     yield put(rejectMessages(error)) 
    } 
} 

這是我的第三和第四產量測試:

const gen = onFetchMessages(fetchMessages(channel)) 
////where export const fetchMessages = createAction(LOAD_MESSAGES); 
const channel = "channel 9" 
const response = [] 

    assert.deepEqual(
     gen.next(response).value, 
     response.json, 
     'should convert response to json' 
    ) 

    const date = Date.now(); 
    assert.deepEqual(
     gen.next(response,channel,date).value, 
     put(receiveMessages(response,channel,date)), 
     'should dispatch LOAD_MESSAGES_SUCCESS with payloads of response, channel and date' 
    ) 

實際是返回undefined,即根。 next(response,channel,date).value返回undefined。你能讓我知道正確的方法來測試這些嗎?謝謝

回答

0

不太確定你的代碼試圖做什麼。此功能的正確測試可能如下所示:

import { put, call } from 'redux-saga/effects'; 

// success route 
const arg = fetchMessage(channel); 
let gen = onFetchMessage(arg); 
assert.deepEqual(
    gen.next().value, 
    put(requestMessages()), 
    'should ...' 
); 

assert.deepEqual(
    gen.next().value, 
    call(fetch, 'api/messages/' + arg.payload), 
    'should ...' 
); 

assert.deepEqual(
    gen.next({ ok: true, json:() => 'test data' }).value, 
    'test data', 
    'should ...' 
); 

assert.deepEqual(
    gen.next('test res').value, 
    put(receiveMessage('test res', arg.payload, moment().format('lll')), // you may need to get date from args, if date does not match 
    'should ...' 
); 

assert.deepEqual(
    gen.next().done, 
    true, 
    'should ...' 
); 

// unsuccessful route 
const arg = fetchMessage(channel); 
let gen = onFetchMessage(arg); 
gen.next(); 
gen.next(); 

assert.deepEqual(
    gen.next({ ok: false, json:() => 'test data' }).done, 
    true, 
    'should ...' 
); 

// exception route 
const arg = fetchMessage(channel); 
let gen = onFetchMessage(arg); 
gen.next(); 
gen.next(); 

assert.deepEqual(
    gen.throw('some error').value, 
    put(rejectMessage('some error'), 
    'should ...' 
);