How to test PUT method using supertest and jasmine - node

I am creating an API with expressjs and my routes look like this:

module.exports = function(app){
var book = require('../controllers/book.controller');

app.get('/api/books', book.getBooks); //get all books
app.post('/api/books', book.addBook); //add a book
app.put('/api/book/:book_id', book.updateBook); //update a book entry
app.delete('/api/book/:book_id', book.deleteBook); //delete a book
}

      

Callback functions are defined as follows

var Book = require('../models/book.model');

module.exports = {
  addBook: function(req, res){
    Book.create(req.body, function(err, book){
      if(err){
        return res.json(400, err);
      }
      res.status(201).json(book);
    });
  },

  getBooks: function(req, res){
    Book.find({}).exec(function(err, books){
      if(err){
        return res.json(400, err);
      }
      res.status(201).json(books);
    });
  },

  getOneBook: function(req, res){
    Book.findById({_id: req.params.book_id}, function(err, book){
      if(error){
        return res.json(400, err)
      }
      res.status(201).json(book);
    })
  },

  updateBook: function(req, res){
    Book.update({_id: req.params.book_id}, req.body, function(err, book){
      if(err){
        return res.json(400, err);
      }
      res.status(201).json(book);
    });
  },

  deleteBook: function(req, res){
    Book.remove({_id: req.params.book_id}, function(err, book){
      if(err){
        return res.json(400, err);
      }
      res.status(200).json(book);
    })
  }
};

      

I am testing routes with jasmine - node and supertest and this is what I have done so far

var app = require('../app.js');
var request = require('supertest')(app);

describe('Test for book route', function(){

  it('Test GET method for /api/books', function(done){
    request
    .get('/api/books')
    .expect(201)
    .expect('Content-Type', 'application/json; charset=utf-8')
    .end(function(err, res){
      if(err){
        return done(err);
      }
      done();
    });
  });

  it('Test POST method for /api/books', function(done){
    var book = {title: 'Ake', author: 'Wole Soyinka', blurb: 'An autobiography'};
    request
      .post('api/books')
      .send(book)
      .expect(200)
      done();
  });
//THIS IS WHERE THE ISSUE IS
  it('Test PUT method for /api/book/:book_id', function(done){
    var bookEdit = {title: 'Ake', author: 'Wole Soyinka', blurb: 'An autobiography by the only Nigerian Nobel Laureate'};
    request
      .put('api/book/:book_id')
      .send(bookEdit)
      .expect(200)
      .done();
  });

});

      

What is the best way to get the book_id variable so that I can edit the post created with the PUT test?

+3


source to share


1 answer


You need to store the book ID for the variable that you are using to create a new book and then pass it as the ID of the book you are trying to update.

This means that you will need to put the book variable outside of its function in order for it to be available to another function. In addition, the post function must access the response to get the returned content of the book.



This is a piece of test code that needs to be updated:

...

var book = {title: 'Ake', author: 'Wole Soyinka', blurb: 'An autobiography'};

...

it('Test POST method for /api/books', function(done){
  var book = {title: 'Ake', author: 'Wole Soyinka', blurb: 'An autobiography'};
  request
    .post('api/books')
    .send(book)
    .expect(200)
    .end(function(err, res){
      if(err){
        return done(err);
      }
      book = res.body;
      done();
    });
});

it('Test PUT method for /api/book/:book_id', function(done){
  var bookEdit = {title: 'Ake', author: 'Wole Soyinka', blurb: 'An autobiography by the only Nigerian Nobel Laureate'};
  request
    .put('api/book/' + book._id)
    .send(bookEdit)
    .expect(200)
    .done();
});

      

+4


source







All Articles