我正在为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?
答案 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语法(例如,导入),则可以使用rewire或babel-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");
}