[英]Testing requests that redirect with mocha/supertest in node
我似乎無法通過mocha , supertest和應該 (和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.