2017-12-19 27 views
0

Node.js node-oracledb에 Oracle 데이터베이스 드라이버를 사용하고 있습니다. 몇 가지 조사를했는데 단위 테스트 DB 연결 방법에 대한 명확한 해결책을 찾을 수 없었습니다. 실제 데이터베이스에 연결하거나 연결을 모의해야합니까? 어떤 프레임 워크가 DB 연결 조롱에 좋을까요? oracledb에 의존하는 단위 테스트 게시 요청/API/로그인을 원합니다. 아래 코드를 공유하십시오. 안내해주십시오.단위 테스트에서 노드 데이터베이스 연결을 모의하는 방법은 무엇입니까?

var express = require('express'); 
var router = express.Router(); 
var oracledb = require('oracledb'); 
var jwt = require('jsonwebtoken'); 
var database = {}; 

router.use('/', function postLogins(req, res) { 

    database.user = req.body.email.toUpperCase(); 
    database.password = req.body.password; 
    database.connectString = process.env.DB_HOST; 

    oracledb.getConnection(
    database, 
    function connectToDatabase(connectionError, connection) { 
     var payload; 

     if (connectionError) { 
     res.set('Content-Type', 'application/json'); 
     res.status(500).send(JSON.stringify({ 
      status: 500, 
      message: 'Error connecting to DB', 
      detailed_message: connectionError.message 
     })); 
     return; 
     } 

     payload = { 
     sub: req.body.email 
     }; 

     res.status(200).json({ 
     user: req.body.email, 
     token: jwt.sign(payload, process.env.SECRET_KEY, { expiresIn: '8h' }) 
     }); 

     connection.release(function onRelease(releaseError) { 
     if (releaseError) { 
      console.error(releaseError.message); 
     } else { 
      console.log('POST /logins : Connection released'); 
     } 
     }); 
    } 
); 
}); 

module.exports = router; 

답변

1

실제 데이터베이스에 연결하거나 연결을 모의해야합니까?

정말 테스트 범위에 따라 다릅니다. 오라클은 사용자가 제어하지 않고 상호 작용해야하는 의존성입니다. 이 코드가 어떤 시점에서 실행되는 한, 아마도 클라이언트에 의해 테스트 될 것이지만 클라이언트에 도달하기 전에 테스트 될 것입니다. 두 가지 접근법 모두 가치 있다고 생각합니다.

DB 연결을 조롱하는 데 유용한 프레임 워크는 무엇입니까?

필자는 의존성을 격리하고 테스트 가능성을 높이기 위해 일종의 디자인 패턴을 사용하려고합니다. 고도로 중첩 된 익명 함수를 사용하면 코드의 일부분을 분리하기가 어려우므로 거의 거친 수준에서 처리기를 사용해야합니다. 핸들러를 분해하고 단위 레벨에서 더 테스트 할 수있게 해주는 몇 가지 옵션이 있습니다.

class PostLogins { 
    constructor(db) { 
    this.db = db || oracledb; 
    } 

    handle(req, res) { 
    // use this.db 
    } 
} 

var pl = new PostLogins(); 
router.use('/', pl.handle); 

이 당신이 직접 핸들러를 행사할 수 있지만, 물론 그것은 당신의 프레임 워크에 연결되어 있는지 테스트하지 않을 것이다 : 나는 첫 번째 단계는 핸들러를 추출 할 수 있다고 생각. 또한 단위 테스트를위한 오라클의 스텁 구현을 제공하여 핸들러의 흐름이 올바르게 작동하는지 확인할 수 있습니다. 스텁 오라클을 사용하는 단위 테스트로도 실제 오라클 상호 작용 및 http 상호 작용에 대한 내용이 누락됩니다. 테스트 가능성을 돕는 또 다른 리팩터는 connectToDatabase입니다.

프로젝트의 성숙도에 따라 oracle을 시작하고 웹 서버를 시작한 다음 끝점을 연습하고 성공적인 응답이 수신되었는지 확인하는 거친 고급 테스트를 먼저 작성하는 것이 좋습니다. 프로젝트 라이프 사이클의 초기 단계이고 구현이 여전히 변경 중이거나 프로젝트가 이미 클라이언트에 릴리스 된 경우 구현 및 리팩터를 변경하고 HTTP 및 성공적인 요청이 포함 된 테스트 범위를 유지할 수 있도록하려면이 접근 방식을 선택합니다. 퇴행하지 않았다.

+0

빠른 응답을 보내 주셔서 감사합니다. 귀하의 답변을 기반으로 내 코드를 리팩터링 할 것입니다. 또한 Nightwatch 프레임 워크를 사용하여 완벽한 기능을 테스트 할 수 있습니다. – user557657