2012-12-28 2 views
6

몇 가지 연결 스타일 엔드 포인트 처리기 (function (req, resp))를 포함하는 node.js의 앱을 작성 중이며 전체 앱을 실행하지 않고도 단위 테스트를 작성하려고합니다.연결 스타일 처리기를 테스트하기 위해 req/res 객체를 쉽게 모의 할 수있는 모듈이 있습니까?

필자가 수동으로 작성한 모든 조명기를 "간단히"푸시 할 수 있다는 것을 알고 있지만이 조명기를 더 빠르게 생성 할 수있는 라이브러리가 있는지 궁금합니다.

EDIT : 내가 원하는 것을 더 설명하기 위해 내 단위 테스트에서 내 처리기 만 실행 (내 앱 아님)하고 싶습니다. 가짜 req 및 res가 필요합니다. 그것들은 제가 조롱하고 싶은 두 가지 물건입니다.

현재 테스트 러너와 코어 어설 션 모듈로 mocha를 사용하고 있습니다.

답변

2

app을 함수에 전달하는 방식으로 경로를 정의한 경우 supertest을 사용하여 경로를 테스트 할 수 있습니다.

테스트

var app = require('./real-or-fixture-app'); //depends on your setup 

require('routeToTest')(app); 

var request = require("supertest"); 

describe("Test", function(){ 
    it("should test a route", function(done){ 
     request(app) 
      .post("/route") 
      .send({data:1}) 
      .expect(200, done); 
    }); 
}); 

경로 정의

module.exports = function(app){ 
    app.get("/route", .... 
}; 

I 나는 이것이 당신이 찾고있는, 그러나 별도로 경로를 테스트 할 수있는 방법이 무엇인지 정말 것을 확신하지 .

+0

이 내가 찾고 있어요 정확히 무엇이라도 유용 . 나는 내가 뭘 찾고 있는지 더 잘 설명하려고 질문을 편집 할 것이다. 답장을 보내 주셔서 감사합니다 :) 그 동안 나는 아주 비슷한 것으로갔습니다. 나는 그것이 더 깨끗하게 보이기 때문에 내가 supertest를 사용했던 것을 리펙토링 할 수있다. –

2

나는이 질문은 오래 알고 있지만 혹시 장고 테스트 클라이언트 라이브러리를 사용했다면 지금이 작업을 수행 할 수있는 좋은 방법은 그렇게 많이 작동 Supertest https://github.com/visionmedia/supertest

함께. 실제 브라우저가 사용자의 시선에 부딪쳤을 때처럼 테스트 시나리오를 얻을 수 있도록 뷰/라우트를 실행하는 것을 시뮬레이션합니다. 즉, req 및 res는 조롱되지만 예상대로 작동합니다. Selenium보다 빠릅니다 (예를 들어, Webdriver를 사용하는 분도기).

아마 알다시피, 단위 테스트를 별도로 수행 할 수 있도록 많은 로직을 경로 밖으로 이동하는 것이 좋습니다. 나는 Supertest를 단위 테스트로 사용하는 것을 정말로 고려하지 않고있다. 왜냐하면 여러분은 항상 단일 코드 단위 이상을 테스트하기 때문이다.

+0

예. 자체 모듈 안에 이미 "비즈니스 로직"이 있지만 엔드 포인트가 작동하는지 테스트하는 방법을 찾고있었습니다. 결국 나는 내가 정말로 찾고 있던 것이 유닛보다 더 많은 통합이라는 것을 깨달았습니다. 그래서 모듈을위한 "통합"레벨과 유닛을위한 Superttest는 잘 작동했습니다 :) –

1

Sinon을 사용하여 모의 요청/응답을 좀 더 쉽게 만들 수있는 작은 패키지에 관심이있을 수 있습니다.

기본적으로 표현식에서 표준 req/res을 모방 한 개체를 만들고 검사 할 수있는 spys로이 메서드를 바꿉니다. README 파일에서

:

귀하의 시험 : src/foo.js

import route from '../src/foo' 
import { mockReq, mockRes } from 'sinon-express-mock' 

describe('my route',() => { 
    it('should foo the bar',() => { 

    const body = { 
     body: { 
     foo: 'bar', 
     }, 
    } 
    const req = mockReq(body) 
    const res = mockRes() 

    route(req, res) 

    expect(res.json).to.be.calledWith({ foo: body.foo.bar }) 
    }) 
}) 

내용 :

export default (req, res) => { 
    res.json({ foo: req.body.bar }) 
} 

https://github.com/danawoodman/sinon-express-mock

관련 문제