title: Mocking http requests in node using mocha and sinon
body: <p>I have written a NodeJS app using express that proxies some calls to external APIs. So I am trying to write a unit test using Mocha and Sinon. My goal is to test the app without any internet connectivity so I am trying to mock the https requests and return mock replies.</p>
  
  <p>I'm having a problem that I can't find any examples or tutorials that fit my case. My node app listens on port 8081 for http requests and then proxies them to another site. I want to test my app without it having to actually send the request to those external servers. I'm trying it below and I put the json replies I want to send back in the server.respondsWith() function.</p>
  
  <p>Am I doing this the right way by making an ajax call with chai? or should I be sending the requests inside my app somehow. Any help is appreciated.</p>
  
  <pre><code>var assert = require('assert');
  var chai = require('chai');
  var spies = require('chai-spies');
  var chaiHttp = require('chai-http');
  var https = require('https');
  var should = chai.should();
  var expect = chai.expect;
  var sinon = require('sinon');
  
  chai.use(spies);
  chai.use(chaiHttp);
  
  describe('Car Repository', function() {
    var server;
    before(function() {
      server = sinon.fakeServer.create();
    });
  
    after(function() {
      server.restore();
    });
  
    var url = 'http://127.0.0.1:8081';
    it('should succeed and return a list of cars', function(done) {
      server.respondWith('POST', 'https://api.sandbox.cars.com/v2/token_endpoint', JSON.stringify({"access_token":"1t3E4IykfpJAbuFsdfM2oFAo5raB5vhfOV0hAYe","token_type":"bearer","expires_in":604800}));
      server.respondWith('GET', url+'/cars', JSON.stringify({'test':'this works'}));
  
      chai.request(url)
        .get('/cars')
        .end(function(err, res) {
          if (err) {
            throw err;
          }
  
          res.should.have.status(200);
          res.body.should.have.property('test');
          console.log(res.body);
  
          done();
        });
      });
  });
  </code></pre>