2017-08-15 2 views
8

J'apprends comment tester et utiliser quelques exemples comme ligne directrice J'essaie de me moquer d'un post de connexion. L'exemple utilisé pour récupérer l'appel http mais j'utilise axios. C'est l'erreur que je reçoiscomment tester reac-saga axios poster

Délai d'attente - rappel Async n'a pas été invoquée dans délai spécifié par jasmine.DEFAULT_TIMEOUT_INTERVAL

Toutes les réponses à cette erreur a dû faire avec fetch, comment dois-je faire cela avec Axios

./saga

const encoder = credentials => Object.keys(credentials).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(credentials[key])}`).join('&') 

const postLogin = credentials => { 
    credentials.grant_type = 'password' 
    const payload = { 
    method: 'post', 
    headers: config.LOGIN_HEADERS, 
    data: encoder(credentials), 
    url: `${config.IDENTITY_URL}/Token` 
    } 
    return axios(payload) 
} 

function * loginRequest (action) { 
    try { 
    const res = yield call(postLogin, action.credentials) 
    utils.storeSessionData(res.data) 
    yield put({ type: types.LOGIN_SUCCESS, data: res.data }) 
    } catch (err) { 
    yield put({ type: types.LOGIN_FAILURE, err }) 
    } 
} 

function * loginSaga() { 
    yield takeLatest(types.LOGIN_REQUEST, loginRequest) 
} 

export default loginSaga 

./login-test

const loginReply = { 
    isAuthenticating: false, 
    isAuthenticated: true, 
    email: '[email protected]', 
    token: 'access-token', 
    userId: '1234F56', 
    name: 'Jane Doe', 
    title: 'Tester', 
    phoneNumber: '123-456-7890', 
    picture: 'pic-url', 
    marketIds: [1, 2, 3] 
} 

describe('login-saga',() => { 
    it('login identity user', async (done) => { 
    // Setup Nock 
    nock(config.IDENTITY_URL) 
     .post('/Token', { userName: '[email protected]', password: 'xxxxx' }) 
     .reply(200, loginReply) 

    // Start up the saga tester 
    const sagaTester = new SagaTester({}) 

    sagaTester.start(loginSaga) 

    // Dispatch the event to start the saga 
    sagaTester.dispatch({type: types.LOGIN_REQUEST}) 

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

    // Check the resulting action 
    expect(sagaTester.getLatestCalledAction()).to.deep.equal({ 
     type: types.LOGIN_SUCCESS, 
     payload: loginReply 
    }) 
    }) 
}) 
+0

comment les générateurs fonctionnent-ils? – JoseAPL

+0

première fois en les utilisant si encore apprendre – texas697

Répondre

1

Vous avez reçu l'erreur suivante: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL parce que vous n'avez pas appelé le rappel done dans votre test.

+0

pouvez-vous montrer ce que vous voulez dire? – texas697

+0

vient d'ajouter ce setTimeout (() => done(), 200) – texas697

+0

cette réponse at-elle résolu le problème? Ce n'est pas clair où vous êtes censé appeler done(). Appeler de cette façon pourrait retourner prématurément done(). – 82Tuskers

1

Puisque vous avez specified a body ({ userName: '[email protected]', password: 'xxxxx' }) dans votre nock moqueur, il ne répondra pas loginReply jusqu'à ce qu'il obtienne une demande de poste à la fois URL donnée et le corps. Mais vous n'envoyez pas credentials avec votre action LOGIN_REQUEST et votre corps de requête axios (payload.data) sera toujours vide. C'est pourquoi votre mocking nock ne répond pas dans le délai d'attente asynchrone spécifié et jest donne cette erreur de délai d'attente.

Pour résoudre ce problème, vous devez soit retirer le corps spécifié dans votre configuration ou de l'envoi nock l'action LOGIN_REQUEST avec des informations d'identification et modification de l'organisme spécifié pour correspondre à des informations d'identification codées que vous définissez à payload.

+0

J'ai retiré les informations d'identification de l'encoche, mais toujours obtenir la même erreur – texas697