簡體   English   中英

測試節點中通過Mocha / Supertest重定向的請求

[英]Testing requests that redirect with mocha/supertest in node

我似乎無法通過mochasupertest應該 (和coffeescript)通過以下集成測試來通過一個快遞項目。


考試

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') )放置在end函數之外和res.text.should.include('logged in')函數內部expect產生相同的結果。 我也嘗試過各種函數調用,例如刪除.type('form')調用,並使用.send(user: 'username', password: 'password')而不是兩個.field()電話。

如果有任何意義,則在應用程序本地運行時向應用程序發送curl POST請求將產生相同的輸出( Moved Temporarily. Redirecting to //127.0.0.1:3456/login

我感覺這是一個小錯誤。 可能是我在應用程序代碼或測試代碼中忘記了一些東西。

有什么建議么?

編輯1:還值得注意的是,當單擊瀏覽器中的“提交”按鈕時,我得到了預期的結果(即顯消息)。

編輯2:進一步調查顯示在Moved Temporarily. Redirecting to ...任何重定向結果的輸出Moved Temporarily. Redirecting to ... Moved Temporarily. Redirecting to ...響應正文。 這使我想知道在app.js中導出應用程序的方式是否有問題。

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

module.exports = app;

對於遇到此頁面的任何人,這個問題的答案都非常簡單。 Moved Temporarily. 響應主體是從超級測試返回的內容。 有關更多詳細信息,請參見問題

總而言之,我最終做了這樣的事情。

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是否符合您的期望即可。 測試Flash消息並查看特定的集成測試應使用另一種方法進行。

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)

我試圖寫一些集成測試對重定向的為好,並通過模塊自己的筆者發現一個很好的例子,要求在這里

在TJ的示例中,他正在使用鏈接,所以我也使用了類似的東西。

考慮一種場景,在這種情況下,已登錄的用戶在注銷時將重定向到主頁。

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();
        });
    });
});

根據您具有的重定向次數,您可能必須嵌套一些回調,但是TJ的示例就足夠了。

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()將跟隨重定向,因此您可以進行常規的視圖測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM