测试在节点中使用mocha/supertest重定向的请求

Fee*_*ech 35 mocha.js node.js express supertest

我似乎无法使用mocha,supertestshould(和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()
Run Code Online (Sandbox Code Playgroud)

相关的应用程序代码

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

失败

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

显然,应用程序代码没有做任何有用的事情.我只是想让测试通过.

将expectation(res.text.should.include('logged in'))置于end函数之外且函数内部expect产生相同的结果.我还尝试了一些函数调用,例如删除.type('form')调用,而.send(user: 'username', password: 'password')不是使用两个.field()调用.

如果它意味着什么,在本地运行时向应用程序发送curl POST请求会产生相同的输出(Moved Temporarily. Redirecting to //127.0.0.1:3456/login)

我有一种感觉,这是一个微不足道的错误.可能是我在应用程序代码或测试代码中遗忘的东西.

有什么建议?

编辑1:值得注意的是,当点击浏览器中的提交按钮时,我得到了预期的结果(一条flash消息).

编辑2:进一步调查显示任何重定向的输出结果在Moved Temporarily. Redirecting to ...响应正文中.这让我想知道我在app.js中导出应用程序的方式是否存在问题.

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

module.exports = app;
Run Code Online (Sandbox Code Playgroud)

Fee*_*ech 25

对于遇到此页面的人来说,这个问题的答案非常简单.该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()
Run Code Online (Sandbox Code Playgroud)

只需检查响应标头location是否符合预期.应使用其他方法测试Flash消息和查看特定的集成测试.

  • ......还有什么其他方法? (8认同)
  • 我在这里特别是因为我试图做"测试flash消息并查看特定的集成测试应该使用另一种方法完成". (3认同)

Bla*_*nic 22

这里有内置的断言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)
Run Code Online (Sandbox Code Playgroud)


sup*_*ing 7

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()
Run Code Online (Sandbox Code Playgroud)

redirects()会执行重定向,所以你可以做你通常的看法测试。