模拟在另一个函数中使用的函数

时间:2017-08-13 18:01:10

标签: reactjs redux react-redux jestjs reactjs-testutils

我正在为react redux中的异步操作编写测试,为了解决这个问题,我在这里简化了代码。这是我的行动功能:

 Cannot read property 'insertBefore' of null

所以问题是函数getLoginStatusUrl()在cookie中进行几次检查并根据某些条件返回相应的url。所以我想要的是模拟这个函数返回例如test.com然后我可以按如下方式测试我的动作:

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()以返回test.com?

2 个答案:

答案 0 :(得分:2)

您不需要它专门返回test.com。使用axios-mock-adapter等库。我没有使用它,但我使用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);
  });

示例代码未经测试,但希望你能得到这个想法。只需阅读库README.md。

在您想要存根/模拟未在此类axios请求中使用的私有导入的场景中,如果您使用es6语法(例如,导入),则可以使用rewirebabel-plugin-rewire。 / p>

@HamedMinaee如果您根本不知道路径,可以执行onGet('/')之类的操作,这些都在README.md中。在测试之后,我想他们是一种重置方法,以便不是所有使用axios的测试都会受到影响。

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

答案 1 :(得分:1)

与sinon一起试试。

    @TargetApi(Build.VERSION_CODES.M)
    @Override
    public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
        onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());
    }

    @SuppressWarnings("deprecation")
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        if (errorCode == -14) // -14 is error for file not found, like 404.
            view.loadUrl("http://youriphost");
    }