我似乎无法使用mocha,supertest和should(以及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')
)置于结束函数之外且位于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 ...
响应正文中。这让我想知道我在app.js中导出应用程序的方式是否存在问题。
var express = require('express')
var app = express();
module.exports = app;
答案 0 :(得分:24)
对于遇到此页面的人来说,这个问题的答案非常简单。 Moved Temporarily.
响应正文是从supertest返回的。有关详细信息,请参阅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
是否符合您的预期。应使用其他方法测试Flash消息并查看特定的集成测试。
答案 1 :(得分:21)
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)
答案 2 :(得分:2)
我试图为重定向的请求编写一些集成测试,并且由模块的作者自己here找到了一个很好的例子。
在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的示例应该足够了。
答案 3 :(得分:2)
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()
将遵循重定向,因此您可以进行常规的视图测试。