2017-02-27 1 views
0

Ich schreibe einige Tests in Karma für reagieren/redux und ich kann nicht scheinen, diesen Fehler zu beheben. Jedes Mal, wenn ein Test ausgeführt wird, läuft er durch die Aktion, sendet den korrekten Wert an den Reduzierer, aber ich erhalte immer eine Antwortrückgabe von undefiniert. Wir Konsole alle Werte bis die Aktualisierung des Status wird protokolliert, aber sobald diese Zeile ausführt:Karma Tests undefined Versprechen in Redux

dispatch(duck.addLabRequest(newLab.toJS())).then(() => { 

wir eine .then undefinierter bekommen. Was könnte die Ursache dafür sein?

Fehler

PhantomJS 2.1.1 (Mac OS X 0.0.0) creating a new lab sends the body of the form in the request FAILED 
     undefined is not an object (evaluating 'promise.then') 

-Test

describe('creating a new lab',() => { 
    let promise; 
    beforeEach(() => { 
    let mockAdapter = new MockAdapter(axios); 
    mockAdapter.onPost(labsURL).reply(201, { 
     lab: newLabWithID, 
     message: "Lab created successfully" 
    }); 
    dispatch(duck.addLabRequest(newLab.toJS())).then(() => { 
     expect(1).to.equal(2); 
    }) 
    }) 
}) 

Aktion

export function addLabRequest(lab) { 
    console.log("lab is: ") 
    console.log(JSON.stringify(lab)); 
    return (dispatch) => { 
    axios.post(`${API_URL}/Labs`, lab, { 
     headers: {'Content-Type': 'application/json'} 
    }) 
     .then((resData) => { 
     console.log("WE GOT HERE"); 
     console.log(JSON.stringify(resData)) 
     dispatch(addLab(resData)) 
     }) 
     .catch((err) => { 
     console.log(err.response.data.message); 
     }); 
    } 
} 

. . .

Reducer

case ADD_LAB: 

    console.log("ADDING LAB"); 
    console.log(JSON.stringify(action.payload)); 
    return state.update(
    'labs', 
    (labs) => labs.push(Immutable.fromJS(action.payload)) 
); 
+0

Ich glaube, Sie auch auch in der 'dispatcher' zurückkehren:' return axios.post (..) 'und ist eine gute Praxis um auch den letzten 'dispatch' innerhalb des' then ((resData) ...) 'zurückzugeben. – caisah

+1

@caisah ok, das hat jetzt funktioniert! Sende eine Antwort und ich akzeptiere sie. –

Antwort

0

Sie in der Dispatcher zurückkehren. Es ist auch eine gute Praxis, den letzten Versand in dem Versprechen zurückzukehren:

export function addLabRequest(lab) { 
    return (dispatch) => { 
    return axios.post(`${API_URL}/Labs`, lab, { 
     headers: {'Content-Type': 'application/json'} 
    }) 
     .then((resData) => { 
     return dispatch(addLab(resData)); 
     }) 
     .catch((err) => { 
     console.log(err.response.data.message); 
     }); 
    } 
} 
Verwandte Themen