통합 테스트로 보안 엔드포인트 테스트
4350 단어 javascriptnodetesting
세션 기반 보안 쿠키를 사용하는 보안 엔드포인트에서 통합 테스트를 생성하는 것은 어려울 수 있습니다! 이 게시물은 세션 기반 쿠키로 보호되는 동안에도 이러한 통합 테스트를 생성하기 위해 취한 접근 방식을 단계별로 설명합니다.
Integration Tests are test that verify a collection of components properly work together to perform a process. A common integration test is from the API Endpoint to the Service Layer.
다음은 서버 설정입니다.
서버.js
const express = require('express')
const session = require('express-session')
const app = express()
const auth = require('./middleware/auth')
app.use(session({
secret: 'jack russell',
resave: false,
saveUinitialized: true,
cookie: { secure: true }
}))
app.use(auth.check)
app.post('/login', (req, res) => {
req.session.user = { name: req.query.name }
res.status(201).json({ ok: true })
})
app.get('/movies', (req, res) => {
res.status(200).json(['Ghostbusters', 'Grounhog Day', 'What about Bob?', 'Stripes', 'Caddyshack'])
})
app.get('/logout', (req, res) => {
res.session.user = null
res.json({ ok: true })
})
if (!module.parent) {
app.listen(3000)
}
module.exports = app
미들웨어/auth.js
exports.check = function (req, res, next) {
if (req.path !== '/login' && req.session.user) {
next()
} else {
res.status(401).json({ message: 'not authorized' })
}
}
따라서 영화 목록을 반환하는 매우 간단한 API가 있지만 영화 목록을 가져오려면 API에 로그인해야 합니다.
테스트를 작성해보자!
테스트/movies.js
const test = require('tape')
const testServer = require('@twilson63/test-server')
const fetch = require('node-fetch')
const app = require('../server')
test('List Movies', async (t) => {
t.plan(1)
const server = testServer(app)
const result = await fetch(server.url + '/movies').then(r => r.json())
t.deepEqual(result, ['Ghostbusters', 'Grounhog Day', 'What about Bob?', 'Stripes', 'Caddyshack'])
server.close()
})
엄청난! 우리의 테스트는 간단하지만 우리의 목적에 부합해야 합니다. 실행해 보겠습니다.
노드 테스트/movies_test.js
not ok 1 should be strictly equal
---
operator: equal
expected: |-
['Ghostbusters', 'Grounhog Day', 'What about Bob?', 'Stripes', 'Caddyshack']
actual: |-
{ message: 'not authorized' }
문제가 무엇입니까?
엔드포인트가 안전하기 때문에 테스트할 수 없습니다. 이 문제를 해결하려면 어떻게 해야 합니까? sinon의 스텁 기능을 사용할 수 있습니다.
const test = require('tape')
const testServer = require('@twilson63/test-server')
const fetch = require('node-fetch')
const sinon = require('sinon')
const auth = require('../middleware/auth')
sinon.stub(auth, 'check').callsFake(function (req, res, next) {
req.user = 'bob'
next()
})
const app = require('../server')
test('List Movies', async (t) => {
t.plan(1)
const server = testServer(app)
const result = await fetch(server.url + '/movies').then(r => r.json())
t.deepEqual(result, ['Ghostbusters', 'Grounhog Day', 'What about Bob?', 'Stripes', 'Caddyshack'])
server.close()
})
결과
TAP version 13
# List Movies
ok 1 should be deeply equivalent
1..1
# tests 1
# pass 1
# ok
sinon.js는 무엇입니까?
Sinon은 애플리케이션에 대한 스파이, 스텁 및 모의 코드를 제공하는 독립형 모의 라이브러리입니다. https://sinonjs.org/ — 나는 Sinon을 남용하지 않는 것이 좋지만 이와 같은 문제에 유용할 수 있습니다. .
요약
보안에 대한 테스트는 코드 테스트에 중점을 둔 테스트를 생성하는 데 유용할 수 있는 sinon과 같은 까다로운 조롱 도구입니다.
전체 예제는 여기에서 볼 수 있습니다: https://github.com/hyper63/testing-secure-endpoints
Reference
이 문제에 관하여(통합 테스트로 보안 엔드포인트 테스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/hyper/testing-secure-endpoints-with-integration-testing-3fp2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)