I need to mock client side HTTP requests. I'm using isomorphic-fetch
in the client side and I'm using mocha
and nock
for testing and mocking. All my client requests are based on relative path. Due to this I'm unable to provide host name for the nock
. Is there a work around.
Client side:
fetch('/foo') //hostname: http://localhost:8080
.then(res => res.json())
.then(data => console.log(data))
.catch(e => console.log(e))
Test suite
nock('/')
.get('/foo')
.reply(200, {data: "hello"})
This is failing as I'm not giving the proper hostname for the nock
. Am I doing something wrong?
For anyone interested: In my react/webpack project I solved this by prepending the fetch url with 'http://localhost' when NODE_ENV
is set to 'test'
.
example:
const testing = process.env.NODE_ENV === 'test';
const apiUrl = `${testing ? 'http://localhost' : ''}/api`;
function getStuffFromApi() {
return fetch(apiUrl, ...)
}
This way, in my test I can always use nock like so:
nock('http://localhost')
.get('/api')
.reply(200, {data: 'hello'})
NOTE: When running my tests, NODE_ENV gets set to 'test'
Found a workaround for this. Have a _ajax-setup.js
in your test folder
import $ from 'jquery'
$(document).ajaxSend((event, jqxhr, settings) => {
settings.url = 'http://0.0.0.0' + settings.url;
})
The thing to note is that this file has to run First and Only Once. Having it as a file runs only once and _
before it makes it alphabetically first.
Later you can test your code with
nock('http://0.0.0.0')
.get('/foo')
.reply(200, {data: "hello"})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With