sitelink1 | https://tacademy.skplanet.com/live/playe...mp;seq=134 |
---|---|
sitelink2 | https://youtu.be/Mt2rgPyQrPs |
sitelink3 | |
extra_vars4 | |
extra_vars5 | |
extra_vars6 |
1. GET /users/:id
1) SUCCESS
- id가 1인 유저 객체를 반환한다
index.spec.js
const assert = require('assert')
const should = require('should')
const request = require('supertest')
const app = require('./index')
describe('GET /users', () => {
})
describe('GET /users/:id', () => {
describe('성공', () => {
it('유저 객체를 반환한다', done => {
request(app)
.get('/users/1')
.end((err, res) => {
res.body.should.have.property('id', 1)
done()
})
})
})
describe('실패', () => {
})
})
index.js
const express = require('express')
const logger = require('morgan')
const app = express()
const users = [
{id:1, name:'Alice'},
{id:2, name:'Bek'},
{id:3, name:'Chris'}
]
app.get('/', (req, res) => res.send('Hello World!'))
app.get('/users', (req, res) => {
})
app.get('/users/:id', (req, res) => { //id를 동적으로 전달받는 라우터이다
// id 값을 얻어낸다
const id = parsetInt(req.params.id, 10) //url 에 포함된 id 파라미터 값을 추출한다
// users 배열 조회
const user = users.filter(user => user.id === id)[0]
// 응답 : res
res.json(user)
})
module.exports = app
2) ERROR
- id가 숫자가 아닐 경우 400으로 응답한다
- id로 유저를 찾을 수 없을 경우 404로 응답한다
index.spec.js
const assert = require('assert')
const should = require('should')
const request = require('supertest')
const app = require('./index')
describe('GET /users', () => {
})
describe('GET /users/:id', () => {
describe('성공', () => {
it('유저 객체를 반환한다', done => {
request(app)
.get('/users/1')
.end((err, res) => {
res.body.should.have.property('id', 1)
done()
})
})
})
describe('실패', () => {
it('id가 숫자가 아닐 경우 400 응답', (done) => { //done 파라미터 값에 유의
request(app)
.get('users/one')
.expect(400)
.end(done) //done 파라미터 값에 유의
})
it('찾을 수 없는 id일 경우 404 응답', (done) => {
request(app)
.get('users/9')
.expect(404)
.end(done)
})
})
})
index.js
const express = require('express')
const logger = require('morgan')
const app = express()
const users = [
{id:1, name:'Alice'},
{id:2, name:'Bek'},
{id:3, name:'Chris'}
]
app.get('/', (req, res) => res.send('Hello World!'))
app.get('/users', (req, res) => {
})
app.get('/users/:id', (req, res) => { //id를 동적으로 전달받는 라우터이다
// id 값을 얻어낸다
const id = parsetInt(req.params.id, 10) //url 에 포함된 id 파라미터 값을 추출한다
//400에러 예외처리
if (Number.isNaN(id)) {
res.status(400).end()
return //예외 처리후 프로그램을 종료해야 한다
}
// users 배열 조회
const user = users.filter(user => user.id === id)[0]
//404에러 예외처리
if (!user) {
res.status(404).end
return //예외 처리후 프로그램을 종료해야 한다
}
// 응답 : res
res.json(user)
})
module.exports = app
2. DELETE /users/:id
1) SUCCESS
- 204를 응답한다
index.spec.js
const assert = require('assert')
const should = require('should')
const request = require('supertest')
const app = require('./index')
describe('GET /users', () => {
})
describe('GET /users/:id', () => {
})
describe('DELETE /users/:id', () => {
describe('성공', () => {
it('204 응답', done => {
request(app)
.delete('/users/3')
.expect(204)
.end(done)
})
})
})
describe('실패', () => {
it('id가 숫자가 아닐 경우 400', done => {
request(app)
.delete('/users/three')
.expect(400)
.end(done)
})
})
})
})
index.js
const express = require('express')
const logger = require('morgan')
const app = express()
let users = [ //let 키워드로 users를 변수로 해야한다 (const로 선언하면 상수이기 때문에 변경이 불가)
{id:1, name:'Alice'},
{id:2, name:'Bek'},
{id:3, name:'Chris'}
]
app.get('/', (req, res) => res.send('Hello World!'))
app.get('/users', (req, res) => {
})
//획득 라우팅
app.get('/users/:id', (req, res) => { //id를 동적으로 전달받는 라우터이다
})
//삭제 라우팅
app.delete('/users/:id', (req, res) => {
const id = parsetInt(req.params.id, 10)
//id가 숫자가 아닐 경우 400
if (Number.isNaN(id)) {
return res.status(400).end()
}
//선택한 id의 사용자를 삭제한다
users = users.filter(user => user.id !== id)
res.status(204).end()
})
module.exports = app
2) ERROR
- id가 숫자가 아닐 경우 400으로 응답한다
index.spec.js
const assert = require('assert')
const should = require('should')
const request = require('supertest')
const app = require('./index')
describe('GET /users', () => {
})
describe('GET /users/:id', () => {
})
describe('DELETE /users/:id', () => {
describe('성공', () => {
it('204 응답', done => {
request(app)
.delete('/users/3')
.expect(204)
.end(done)
})
})
})
describe('실패', () => {
it('id가 숫자가 아닐 경우 400', done => {
request(app)
.delete('/users/three')
.expect(400)
.end(done)
})
})
})
})
index.js
const express = require('express')
const logger = require('morgan')
const app = express()
let users = [ //let 키워드로 users를 변수로 해야한다 (const로 선언하면 상수이기 때문에 변경이 불가)
{id:1, name:'Alice'},
{id:2, name:'Bek'},
{id:3, name:'Chris'}
]
app.get('/', (req, res) => res.send('Hello World!'))
app.get('/users', (req, res) => {
})
//획득 라우팅
app.get('/users/:id', (req, res) => { //id를 동적으로 전달받는 라우터이다
})
//삭제 라우팅
app.delete('/users/:id', (req, res) => {
const id = parsetInt(req.params.id, 10)
//id가 숫자가 아닐 경우 400
if (Number.isNaN(id)) {
return res.status(400).end()
}
//선택한 id의 사용자를 삭제한다
users = users.filter(user => user.id !== id)
res.status(204).end()
})
module.exports = app
3. POST /users
1) SUCCESS
- 201 상태 코드를 반환한다
- 생성된 유저 객체를 반환한다
- 입력한 name을 반환한다
index.spec.js
const assert = require('assert')
const should = require('should')
const request = require('supertest')
const app = require('./index')
describe('GET /users', () => {
})
describe('GET /users/:id', () => {
})
describe('DELETE /users/:id', () => {
})
describe('POST /users', () => {
describe('성공', () => {
it('201 응답', done => {
request(app)
.post('/users') //post로 데이터를 전달한다
.send({name: 'Daniel'}) //post의 body를 전송
.expect(201)
.end(done)
})
})
it('생성한 유저 객체를 반환한다', done => {
request(app)
.post('/users') //post로 데이터를 전달한다
.send({name: 'Daniel'}) //post의 body를 전송
.expect(201)
.end((err, res) => {
res.body.should.have.property('name', 'Daniel')
done()
})
})
})
describe('실패', () => {
it('', done => {
request(app)
})
})
it('', done => {
request(app)
})
})
})
})
index.js
const express = require('express')
const logger = require('morgan')
const bodyParsert = require('body-parser')
const app = express()
let users = [ //let 키워드로 users를 변수로 해야한다 (const로 선언하면 상수이기 때문에 변경이 불가)
{id:1, name:'Alice'},
{id:2, name:'Bek'},
{id:3, name:'Chris'}
]
//morgan 사용 선언
app.use(logger('dev'))
//body-parser 사용 선언
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
app.get('/', (req, res) => res.send('Hello World!'))
app.get('/users', (req, res) => {
})
//획득 라우팅
app.get('/users/:id', (req, res) => { //id를 동적으로 전달받는 라우터이다
})
//삭제 라우팅
app.delete('/users/:id', (req, res) => {
})
//app.post() : express 의 post함수를 통해 처리한다
//req.body : request의 body를 추출하여 처리
//body-parser : body는 express에서 제공하지 않는 속성이다 그래서 body-parser라는 써드파티 라이브러리를 사용한다
app.post('/users', (req, res) => {
const name = req.body.name //bodyParser가 body에 접근 할 수 있게 해준다
const id = Date.now() //id는 임의로 생성 (timestamp)
const user = {id, name}
users.push(user) //생성한 사용자 객체를 추가
res.status(201).json(user) //생성한 사용자와 수행 결과를 응답해 준다
})
module.exports = app
2) ERROR
- name 파라미터 누락시 400을 반환한다
- name이 중복일 경우 409를 반환한다
index.spec.js
const assert = require('assert')
const should = require('should')
const request = require('supertest')
const app = require('./index')
describe('GET /users', () => {
})
describe('GET /users/:id', () => {
})
describe('DELETE /users/:id', () => {
})
describe('POST /users', () => {
describe('성공', () => {
})
describe('실패', () => {
it('', done => {
request(app)
.post('/users').send({})
.expect(400).end(done)
})
})
it('', done => {
request(app)
.post('/users').send({name: 'Alice'})
.expect(409).end(done)
})
})
})
})
index.js
const express = require('express')
const logger = require('morgan')
const bodyParsert = require('body-parser')
const app = express()
let users = [ //let 키워드로 users를 변수로 해야한다 (const로 선언하면 상수이기 때문에 변경이 불가)
{id:1, name:'Alice'},
{id:2, name:'Bek'},
{id:3, name:'Chris'}
]
//morgan 사용 선언
app.use(logger('dev'))
//body-parser 사용 선언
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
app.get('/', (req, res) => res.send('Hello World!'))
app.get('/users', (req, res) => {
})
//획득 라우팅
app.get('/users/:id', (req, res) => { //id를 동적으로 전달받는 라우터이다
})
//삭제 라우팅
app.delete('/users/:id', (req, res) => {
})
//app.post() : express 의 post함수를 통해 처리한다
//req.body : request의 body를 추출하여 처리
//body-parser : body는 express에서 제공하지 않는 속성이다 그래서 body-parser라는 써드파티 라이브러리를 사용한다
app.post('/users', (req, res) => {
const name = req.body.name //bodyParser가 body에 접근 할 수 있게 해준다
if (!name) { //입력값이 있는지 검사
return res.status(400).end()
}
const found = users.filter(user => user.name === name).length //이름이 같은 유저들의 객체를 리턴하는지 검사
if(found) {
return res.status(409).end()
}
const id = Date.now() //id는 임의로 생성 (timestamp)
const user = {id, name}
users.push(user) //생성한 사용자 객체를 추가
res.status(201).json(user) //생성한 사용자와 수행 결과를 응답해 준다
})
module.exports = app
4. PUT /users/:id
1) SUCCESS
- 변경된 name을 응답한다
index.spec.js
index.js
2) ERROR
- 정수가 아닌 id일 경우 400 응답
- name이 없을 경우 400 응답
- 존재하지 않는 유저일 경우 404 응답
- 이름이 중복일 경우 409 응답
index.spec.js
index.js
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
5 | [TDD/REST-7강] 코드 리팩토링 (express.Router, control) | 황제낙엽 | 2020.12.04 | 87 |
» | [TDD/REST-6강] 사용자 API 개발 | 황제낙엽 | 2020.12.03 | 81 |
3 |
[TDD/REST-목차][T아카데미] Node.js 기반의 REST API 서버 개발
![]() | 황제낙엽 | 2020.12.03 | 77 |
2 | [TDD/REST-5강] TDD로 API 서버 개발 (작업절차, get users 테스트) | 황제낙엽 | 2020.12.01 | 82 |
1 | [TDD/REST-4강] TDD 이해 및 환경 구축 (Rest API, TDD, mocha, Should, SuperTest) | 황제낙엽 | 2020.12.01 | 83 |