与在节点摩卡/ supertest重定向测试要求(Testing requests that red

2019-07-31 08:43发布

我似乎无法得到以下集成测试使用中明确项目通过摸查 , 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;

Answer 1:

对于任何人谁碰到这个页面来了,这个问题的答案是非常简单的。 该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是你希望它是什么。 测试闪存和查看特定的集成测试应该使用另一种方法来完成。



Answer 2:

还有就是内置的断言这个在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)


Answer 3:

我试图写该重定向,以及,由模块自己的笔者发现一个很好的例子,要求一些集成测试在这里 。

在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的例子就足够了。



Answer 4:

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()将遵循重定向,所以你可以做你通常的看法测试。



文章来源: Testing requests that redirect with mocha/supertest in node