Как проверить метод PUT, используя супертест и жасминовый узел
Я строю API с помощью expressjs, и мои маршруты выглядят так
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 ответ
Вам необходимо сохранить идентификатор книги в переменной, которую вы используете для создания новой книги, а затем передать ее как идентификатор книги, которую вы пытаетесь обновить.
Это означает, что вам нужно поместить переменную 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();
});