2017-07-10 123 views
5

愛可信我在這個動作反應過來如何測試開玩笑

export function fetchPosts() { 
    const request = axios.get(`${WORDPRESS_URL}`); 
    return { 
     type: FETCH_POSTS, 
     payload: request 
    } 
} 

我如何在這種情況下,考愛可信? Jest有這個用例在那裏他們使用模擬函數的異步代碼,但我不知道我是否可以用axios做到這一點?裁判:https://facebook.github.io/jest/docs/tutorial-async.html

我已經做到了這一點,到目前爲止,測試它返回正確的類型

it('should dispatch actions with the correct type',() => { 
    store.dispatch(fetchPosts()); 
    let action = store.getActions(); 
    expect(action[0].type).toBe(FETCH_POSTS); 
}); 

我不知道如何在模擬數據和測試然而它返回傳遞,有沒有人有任何想法?

謝謝你提前

+1

https:// github。com/mzabriskie/moxios –

+0

對於我的測試,我使用了以下內容:https://gist.github.com/knee-cola/00641c39a268f0b96f1842640b87f3a2。這是寫在Typescript,但可以很容易地轉換爲香草JS –

回答

12

我用axios模擬適配器。 在這種情況下,服務在./chatbot中描述。 在模擬適配器中,指定在URL被擊中時要返回的內容。

import axios from 'axios'; 
import MockAdapter from 'axios-mock-adapter'; 
import chatbot from './chatbot'; 

describe('Chatbot',() => { 
    it('returns data when sendMessage is called', done => { 
     var mock = new MockAdapter(axios); 
     const data = { response: true }; 
     mock.onGet('https://us-central1-hutoma-backend.cloudfunctions.net/chat').reply(200, data); 

     chatbot.sendMessage(0, 'any').then(response => { 
      expect(response).toEqual(data); 
      done(); 
     }); 
    }); 
}); 

你可以看到它在這裏,整個例如:

服務: https://github.com/lnolazco/hutoma-test/blob/master/src/services/chatbot.js

測試: https://github.com/lnolazco/hutoma-test/blob/master/src/services/chatbot.test.js

+0

謝謝路易斯這已經幫了我很多 – Adear

1

我和nock做到了這一點,就像這樣:

import nock from 'nock' 
import axios from 'axios' 
import httpAdapter from 'axios/lib/adapters/http' 

axios.defaults.adapter = httpAdapter 

describe('foo',() => { 
    it('bar',() => { 
     nock('https://example.com:443') 
      .get('/example') 
      .reply(200, 'some payload') 

     // test... 
    }) 
}) 
+0

我做了這個,但我似乎axios不能很好地與nock.https://github.com/node- nock/nock/issues/699但是非常感謝您的幫助 – Adear

1

我能做到這一點下面的步驟:

  1. 使用我實現模塊測試

的模擬將創建一個文件夾模擬

  • 實施axios.js模擬文件
  • 自動發生

    模擬mod示例ULE:

    module.exports = { 
        get: jest.fn((url) => { 
         if (url === '/something') { 
          return Promise.resolve({ 
           data: 'data' 
          }); 
         } 
        }), 
        post: jest.fn((url) => { 
         if (url === '/something') { 
          return Promise.resolve({ 
           data: 'data' 
          }); 
         } 
         if (url === '/something2') { 
          return Promise.resolve({ 
           data: 'data2' 
          }); 
         } 
        }), 
        create: jest.fn(function() { 
         return this; 
        }) 
    }; 
    
  • 0

    對於那些希望使用愛可信-模擬適配器代替mockfetch示例了Redux文檔for async testing中,我成功地利用下列

    actions.test.js

    describe('SignInUser',() => { 
        var history = { 
        push: function(str) { 
         expect(str).toEqual('/feed'); 
        } 
        } 
    
        it('Dispatches authorization',() => { 
        let mock = new MockAdapter(axios); 
        mock.onPost(`${ROOT_URL}/auth/signin`, { 
         email: '[email protected]', 
         password: 'test' 
        }).reply(200, {token: 'testToken' }); 
    
        const expectedActions = [ { type: types.AUTH_USER } ]; 
        const store = mockStore({ auth: [] }); 
    
        return store.dispatch(actions.signInUser({ 
         email: '[email protected]', 
         password: 'test', 
        }, history)).then(() => { 
         expect(store.getActions()).toEqual(expectedActions); 
        }); 
    
    }); 
    

    在爲了測試成功案例signInUser in actions/index.js

    export const signInUser = ({ email, password }, history) => async dispatch => { 
        const res = await axios.post(`${ROOT_URL}/auth/signin`, { email, password }) 
        .catch(({ response: { data } }) => { 
         ... 
        }); 
    
        if (res) { 
        dispatch({ type: AUTH_USER });     // test verified this 
        localStorage.setItem('token', res.data.token); // test mocked this 
        history.push('/feed');       // test mocked this 
        } 
    } 
    

    鑑於這是在開玩笑,本地存儲調用不得不被嘲笑。這是在src/setupTests.js

    const localStorageMock = { 
        removeItem: jest.fn(), 
        getItem: jest.fn(), 
        setItem: jest.fn(), 
        clear: jest.fn() 
    }; 
    global.localStorage = localStorageMock; 
    
    +0

    您是如何使用localStorageMock的? –

    +0

    @Kermit_ice_tea在create-react-app中記錄了'src/setupTests.js'作爲用於jest /酶測試的全局設置。在那個文件中,我創建了一個對象,我用dummy函數(getItem,setItem)隨意調用'localStorageMock'。神奇的是,我將'global.localStorage'設置爲等於這個對象的底部。我可以在一行中完成,而不是命名對象localStorageMock。整個設置的目的是簡單地避免在測試期間處理本地存儲的代碼被破壞。 – vapurrmaid