2012-12-28 19 views
6

मैं node.js में एक ऐप लिख रहा हूं जिसमें कुछ कनेक्ट स्टाइल एंडपॉइंट हैंडलर (फ़ंक्शन (रिक, रेस) शामिल हैं) और पूर्ण ऐप चलाने के बिना उनके खिलाफ कुछ यूनिट परीक्षण लिखना चाहते हैं।क्या एक स्टाइल स्टाइल हैंडलर यूनिट परीक्षण के लिए रिक्त/res ऑब्जेक्ट्स आसानी से नकल करने के लिए कोई मॉड्यूल है?

मुझे पता है कि मैं जो भी दृढ़ता से मैन्युअल रूप से लिखता हूं उसे "बस" दबा सकता हूं, लेकिन मैं सोच रहा था कि क्या इन फिक्स्चर को तेजी से उत्पन्न करने में मेरी सहायता करने के लिए कोई पुस्तकालय है या नहीं।

संपादित करें: मुझे जो कुछ चाहिए, उसे आगे बढ़ाने के लिए, मैं अपने यूनिट परीक्षण में केवल अपने हैंडलर को निष्पादित करना चाहता हूं (मेरा ऐप नहीं) और इसके लिए, मुझे नकली रिक और आरएस की आवश्यकता होगी। वे 2 वस्तुएं हैं जिन्हें मैं नकल करना चाहता हूं।

मैं वर्तमान में परीक्षण धावक और कोर assert मॉड्यूल के रूप में 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", .... 
}; 

मैं कर रहा हूँ काफी यकीन नहीं है कि यह वास्तव में है कि आप क्या देख रहे हैं, लेकिन यह अलग से अपने मार्गों का परीक्षण करने के लिए एक रास्ता है ।

+0

यह उपयोगी है, मैं वास्तव में क्या देख रहा हूँ नहीं यद्यपि । जो मैं ढूंढ रहा हूं उसे बेहतर तरीके से समझने और समझाने के लिए मैं प्रश्न संपादित करूंगा। यद्यपि उत्तर देने के लिए धन्यवाद :) इस बीच में मैं कुछ इसी तरह के साथ चला गया। मैं प्रतिबिंबित कर सकता हूं जो मैंने सबसे अच्छा उपयोग करने के लिए किया था क्योंकि यह क्लीनर दिखता है। –

2

मैं जानता हूँ कि इस सवाल पुराना है, लेकिन अब यह करने के लिए एक शानदार तरीका, क्या आपने कभी Django परीक्षण ग्राहक पुस्तकालय का उपयोग किया है Supertest https://github.com/visionmedia/supertest

साथ है ऐसा एक बहुत काम करता है। यह आपके विचार/मार्गों को चलाने के अनुकरण करता है ताकि आपको एक परीक्षण परिदृश्य मिल जाए जैसे कि कोई वास्तविक ब्राउज़र आपका विचार मार रहा हो। इसका मतलब है कि req और res mock out हैं लेकिन अपेक्षित तरीके से व्यवहार करते हैं। यह सेलेनियम से तेज है (या, उदाहरण के लिए, प्रोटैक्टर, जो कवर के तहत वेबड्राइवर का उपयोग करता है)।

जैसा कि आप शायद जानते हैं, अपने मार्गों में से अधिकतर तर्कों को स्थानांतरित करना एक अच्छा विचार है ताकि इसे अलग-अलग परीक्षण किया जा सके। मैं वास्तव में यूनिट परीक्षण के रूप में सुपरटेस्ट का उपयोग करने पर विचार नहीं करता, क्योंकि आप हमेशा कोड की एक इकाई से अधिक परीक्षण कर रहे हैं।

+0

हां। मेरे पास पहले से ही अपने मॉड्यूल के अंदर मेरा "बिजनेस लॉजिक" था, लेकिन मैं परीक्षण करने का एक तरीका ढूंढ रहा था कि एंडपॉइंट्स ने काम किया था। अंत में मुझे एहसास हुआ कि जो मैं वास्तव में खोज रहा था वह इकाई की तुलना में अधिक एकीकरण था, इसलिए मॉड्यूल के लिए "एकीकरण" स्तर और इकाई के लिए सुपरटेस्ट बस ठीक काम किया :) –

1

आपको एक छोटे से पैकेज में दिलचस्पी हो सकती है जो मैंने एक साथ रखा है जो सिनोन का उपयोग करके नकली अनुरोध/प्रतिक्रियाओं को थोड़ा आसान बनाता है।

संक्षेप में यह केवल एक ऑब्जेक्ट बनाता है जो मानक से req/res की नकल करता है और उस विधि के साथ विधि को प्रतिस्थापित करता है जिसका आप निरीक्षण कर सकते हैं।

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