2012-09-04 8 views
28

में मोचा/सुपरटेस्ट के साथ रीडायरेक्ट करते हैं, मुझे mocha, supertest, और should (और कॉफ़ीस्क्रिप्ट) का उपयोग करके एक एक्सप्रेस प्रोजेक्ट में पास करने के लिए निम्न एकीकरण परीक्षण नहीं मिल रहा है।परीक्षण अनुरोध जो नोड


परीक्षण

should = require('should') 
request = require('supertest') 
app  = require('../../app') 

describe 'authentication', -> 
    describe 'POST /sessions', -> 
    describe 'success', (done) -> 
     it 'displays a flash', (done) -> 
     request(app) 
      .post('/sessions') 
      .type('form') 
      .field('user', 'username') 
      .field('password', 'password') 
      .end (err, res) -> 
      res.text.should.include('logged in') 
      done() 

प्रासंगिक आवेदन कोड

app.post '/sessions', (req, res) -> 
    req.flash 'info', "You are now logged in as #{req.body.user}" 
    res.redirect '/login' 

विफलता

1) authentication POST /sessions success displays a flash: 
    AssertionError: expected 'Moved Temporarily. Redirecting to //127.0.0.1:3456/login' to include 'logged in' 

जाहिर है, आवेदन कोड कुछ भी उपयोगी नहीं करता है। मैं सिर्फ परीक्षा उत्तीर्ण करने की कोशिश कर रहा हूं।

एंड फ़ंक्शन के बाहर अपेक्षा (res.text.should.include('logged in')) को रखने और expect फ़ंक्शन के अंदर समान परिणाम उत्पन्न होते हैं। मैंने फ़ंक्शन कॉल की विविधता भी कोशिश की है, उदाहरण के लिए .type('form') कॉल को हटाकर, और का उपयोग करकेकॉल के बजाय।

यह कुछ भी मतलब है, तो एप्लिकेशन को जब यह स्थानीय स्तर पर चल रहा है करने के लिए एक कर्ल पोस्ट अनुरोध भेजने के एक ही आउटपुट (Moved Temporarily. Redirecting to //127.0.0.1:3456/login)

मुझे लगता है पैदावार इस एक छोटी सी त्रुटि है। शायद मैं कुछ कोड कोड या परीक्षण कोड में भूल रहा हूँ।

कोई सुझाव?

संपादित करें 1: यह भी ध्यान देने योग्य है कि ब्राउज़र में सबमिट बटन पर क्लिक करते समय मुझे अपेक्षित परिणाम (एक फ्लैश संदेश) मिलता है।

संपादित करें 2: आगे की जांच की किसी भी अनुप्रेषित Moved Temporarily. Redirecting to ... प्रतिक्रिया शरीर में परिणाम उत्पादन को दर्शाता है। इससे मुझे आश्चर्य होता है कि ऐप में निर्यात करने के तरीके में कोई समस्या है या नहीं।

var express = require('express') 
var app = express(); 

module.exports = app; 
+0

कृपया एक नज़र डालें: http://stackoverflow.com/questions/14001183/how-to-authenticate-supertest-requests-with-passport/37609721#37609721 –

उत्तर

22

इस पृष्ठ पर आने वाले किसी भी व्यक्ति के लिए, इस प्रश्न का उत्तर बहुत आसान है। Moved Temporarily. प्रतिक्रिया शरीर सबसे अच्छा से लौटाया जाता है। अधिक जानकारी के लिए the issue देखें।

सारांशित करने के लिए, मैंने ऐसा कुछ करने का अंत किया।

should = require('should') 
request = require('supertest') 
app  = require('../../app') 

describe 'authentication', -> 
    describe 'POST /sessions', -> 
    describe 'success', -> 
     it 'redirects to the right path', (done) -> 
     request(app) 
      .post('/sessions') 
      .send(user: 'username', password: 'password') 
      .end (err, res) -> 
      res.header['location'].should.include('/home') 
      done() 

बस जाँच लें कि प्रतिक्रिया हेडर location क्या आप इसे होने की उम्मीद है। फ्लैश संदेशों के लिए परीक्षण और विशिष्ट एकीकरण परीक्षण देखने के लिए किसी अन्य विधि का उपयोग किया जाना चाहिए।

+8

... अन्य विधि क्या है? – Alex

+3

मैं यहाँ विशेष रूप से कर रहा हूँ क्योंकि मैं ऐसा करने के लिए कोशिश कर रहा था "एक और विधि का उपयोग किया जाना चाहिए फ़्लैश संदेशों के लिए परीक्षण और विशिष्ट एकीकरण परीक्षणों में देखते हैं।" –

+0

शीर्षक में स्थान की जाँच करने के लिए इसके अलावा, आप की जाँच करनी चाहिए res.statusCode 302 (अनुप्रेषित) है। – thefinnomenon

2

मैं अनुरोध करता है कि रूप में अच्छी तरह निर्देशित कर दिये, और मॉड्यूल खुद here के लेखक द्वारा एक अच्छा उदाहरण पाया के लिए कुछ एकीकरण परीक्षणों लिखने की कोशिश कर रहा था।

टीजे के उदाहरण में, वह श्रृंखलन उपयोग कर रहा है, तो मैं ऐसा ही कुछ के रूप में अच्छी तरह से इस्तेमाल किया।

एक परिदृश्य पर विचार करें जिसमें एक लॉग-इन उपयोगकर्ता को होम पेज पर रीडायरेक्ट किया गया है जब वह लॉग आउट करता है।

it('should log the user out', function (done) { 
    request(app) 
    .get('/logout') 
    .end(function (err, res) { 
     if (err) return done(err); 
     // Logging out should have redirected you... 
     request(app) 
     .get('/') 
     .end(function (err, res) { 
      if (err) return done(err); 
      res.text.should.not.include('Testing Tester'); 
      res.text.should.include('login'); 
      done(); 
     }); 
    }); 
}); 

कितने पुनर्निर्देश आप पर निर्भर करता है, तो आपको कुछ कॉलबैक घोंसला करना पड़ सकता है, लेकिन टीजे के उदाहरण पर्याप्त होना चाहिए।

18

वहाँ supertest में अंतर्निहित होता है इस बात के लिए जोर:

should = require('should') 
request = require('supertest') 
app  = require('../../app') 

describe 'authentication', -> 
    describe 'POST /sessions', -> 
    describe 'success', -> 
     it 'redirects to the right path', (done) -> 
     request(app) 
      .post('/sessions') 
      .send(user: 'username', password: 'password') 
      .expect(302) 
      .expect('Location', '/home') 
      .end(done) 
1
describe 'authentication', -> 
    describe 'POST /sessions', -> 
    describe 'success', (done) -> 
     it 'displays a flash', (done) -> 
     request(app) 
      .post('/sessions') 
      .type('form') 
      .field('user', 'username') 
      .field('password', 'password') 
      .redirects(1) 
      .end (err, res) -> 
      res.text.should.include('logged in') 
      done() 

redirects() रीडायरेक्ट का पालन करेंगे तो आप अपने सामान्य दृश्य परीक्षण कर सकते हैं।

+0

यह एक पुरानी पोस्ट हो सकता है लेकिन .redirects (1) खूबसूरती से मुझे पुनः निर्देश त्रुटि जबकि परीक्षण को हल करने के लिए काम किया। धन्यवाद – SteveB

संबंधित मुद्दे