2017-08-13 67 views
2

我正在爲我的異步操作編寫測試,以處理簡單的代碼。這裏是我的動作功能:模擬在另一個函數中使用的函數

export function updateUserAuthenticationStatus(){ 
return function(dispatch){ 
    return axios.get(getLoginStatusUrl()) 
     .then(response => { 
       const middlewares = [thunk]; 
       const mockStore = configureMockStore(middlewares); 
       const store = mockStore(); 
    return store.dispatch(updateUserAuthenticationStatus()).then(()=>{ 
     //expect(store.getActions()[0]).to.eql(expectedActions); 
    }); 
      }); 
     }).catch(function(response){ 
    }); 
    } 
} 

所以問題是功能getLoginStatusUrl(),它確實對夫婦檢查的cookie,並返回基於某些條件下,適當的URL。所以,我要的是嘲笑這個函數返回例如test.com然後我可以測試我的行動如下:

it("",() => { 
     **here I want to mock getLoginStatusUrl() to return test.com** 
    nock("test.com") 
     .get("/") 
     .reply(200,"test detail"); 

}) 

我怎麼能嘲笑getLoginStatusUrl()在這種情況下返回test.com?

回答

2

你不需要它專門返回test.com。使用庫如。我沒有使用它personaly,但我使用fetch-mock模擬獲取api請求,使概念應該是完全一樣的。

比方說getLoginStatusUrl()返回/loginStatus,(因爲你沒有顯示它返回的是什麼)。

例子:

var axios = require('axios'); 
var MockAdapter = require('axios-mock-adapter'); 

// This sets the mock adapter on the default instance 
var mock = new MockAdapter(axios); 

// Mock any GET request to /users 
// arguments for reply are (status, data, headers) 
mock.onGet('/loginStatus').reply(200, { 
    loginSuccess: true 
}); 

axios.get('/loginStatus') 
    .then(function(response) { 
    console.log(response.data); 
    }); 

的示例代碼是未經測試,但hopefuly你的想法。只要閱讀庫README.md。

在場景中,如果您希望對未在axios請求中使用的私有導入進行存根/模擬,則可以使用rewirebabel-plugin-rewire(如果使用es6語法(如導入))。

@HamedMinaee如果你根本不知道路徑,那麼你可以做一些類似於onGet('/')的事情,它都在README.md中。在測試之後,我想他們是重置這個方法的一種方式,所以不是所有使用axios的測試都會受到它的影響。

afterEach(() => { 
    // reset the axios mock here so that '/' doesn't affect all requests or something. 
}); 
+0

非常感謝您的回答,我會開始研究它並讓您知道結果。只是一個問題:我有一個getLoginStatusUrl函數來獲取url,我們根本不知道路徑,但是在這裏我們有onGet('/ loginStatus')模擬函數,我們定義路徑'/ loginStatus'它如何解決這個問題? –

+0

@HamedMinaee看到編輯。 –

+0

非常感謝我正在處理它,並讓你知道結果 –

1

用sinon試試這個。

import {getLoginStatusUrl} from './some/path.js' 

let stub = sinon.stub(), 
opts = { call: getLoginStatusUrl() }; 

stub.withExactArgs().returns("somePredefinedReturnValue") 
+0

謝謝你做這個工作,如果getLoginStatusUrl是一個私人函數? –

+0

將函數導出爲類似'export function getLoginStatusUrl(){...}'的ES模塊,然後將其導入到此處。我假設你在你的行動中也是這樣做的。 –

+0

是的,但爲了編寫代碼的最佳實踐,出於測試目的而導出函數是個好主意嗎? –

相關問題