我似乎无法得到以下集成测试使用中明确项目通过摸查 , 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')
的函数端的外部和内部expect
函数产生相同的结果。 我也试着函数调用的变化,例如去掉.type('form')
的呼叫,并使用.send(user: 'username', password: 'password')
而不是两个.field()
调用。
如果这意味着什么,送卷曲POST请求的应用程序时,它在本地运行产生相同的输出( Moved Temporarily. Redirecting to //127.0.0.1:3456/login
)
我有一种感觉,这是一个微不足道的错误。 可能是什么我忘了在应用程序代码或测试代码。
有什么建议?
编辑1:这也是值得注意的是,在浏览器中点击提交按钮时,我得到了预期的效果(即显信息)。
编辑2:进一步调查显示的任何重定向的结果输出Moved Temporarily. Redirecting to ...
Moved Temporarily. Redirecting to ...
响应体。 这使我不知道是否有在我出口中app.js.应用程序的方式有问题
var express = require('express')
var app = express();
module.exports = app;
对于任何人谁碰到这个页面来了,这个问题的答案是非常简单的。 该Moved Temporarily.
响应体就是从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')
.end (err, res) ->
res.header['location'].should.include('/home')
done()
只是检查响应头location
是你希望它是什么。 测试闪存和查看特定的集成测试应该使用另一种方法来完成。
还有就是内置的断言这个在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()
将遵循重定向,所以你可以做你通常的看法测试。