如何使用supertest和jasmine-node测试PUT方法

时间:2015-05-07 19:15:59

标签: supertest jasmine-node

我正在使用expressjs构建API,我的路线看起来像这样

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
}

回调函数定义如下

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);
    })
  }
};

我正在使用jasmine-node和supertest测试路由,这是我到目前为止所做的

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();
  });

});

获取book_id变量的最佳方法是什么,以便我可以编辑使用PUT测试创建的条目?

1 个答案:

答案 0 :(得分:7)

您需要将图书的ID存储到用于创建新图书的变量中,然后将其作为您要更新的图书的ID传递。

这意味着您需要将book变量放在it函数之外,以便其它函数可以访问它。 post it功能还需要访问响应以获取返回的书籍内容。

这是需要更新的测试代码的一部分:

...

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();
});