【问题标题】:mocha and supertest.agent not working as expectedmocha 和 supertest.agent 没有按预期工作
【发布时间】:2014-06-01 12:38:42
【问题描述】:

我正在尝试编写一些需要首先进行身份验证的测试。如果我在“之前()”中提出多个请求,我会被拒绝连接。如果我在“before()”和“it()”之间拆分它,它可以工作,但我无法实现我想要的。

我想工作的代码:

var agent = request.agent(myExpressApp),
      token;
    before(function(done) {
      async.series([
        function(cb) {
          agent
            .post('/1/auth/login')
            .send({
              email: 'john@smith.com',
              password: 'j0hn_Sm1TH'
            })
            .expect(200)
            .end(cb);
        }, function(cb) {
          agent
            .get('/1/auth/authorize')
            .query({
              response_type: 'token',
              client_id: 'some id',
              redirect_uri: 'http://ignore'
            })
            .expect(302)
            .end(function(err, res) {
              /* console.log(arguments) = { '0': 
                { [Error: connect ECONNREFUSED]
                  code: 'ECONNREFUSED',
                  errno: 'ECONNREFUSED',
                  syscall: 'connect' } }*/
              if (err) return cb(err);
              cb();
            });
        }
      ], done);
    });
    it('some authenticated task', function(done) {
      // do something else
      done();
    });

正在运行的代码:

var agent = request.agent(myExpressApp),
      token;
    before(function(done) {
      async.series([
        function(cb) {
          agent
            .post('/1/auth/login')
            .send({
              email: 'john@smith.com',
              password: 'j0hn_Sm1TH'
            })
            .expect(200)
            .end(cb);
        }, function(cb) {
          cb();
        }
      ], done);
    });
    it('some authenticated task', function(done) {
      agent
        .get('/1/auth/authorize')
        .query({
          response_type: 'token',
          client_id: 'some id',
          redirect_uri: 'http://ignore'
        })
        .expect(302)
        .end(function(err, res) {
          if (err) return done(err);
          done();
        });
    });

【问题讨论】:

  • 奇怪的是,如果我将 function(cb) { process.nextTick(cb); } 添加到 async.series 中,它会按需要工作。这似乎有点hacky。有没有合适的方法来做到这一点?

标签: express mocha.js supertest node-async superagent


【解决方案1】:

你遇到了issue 153 with superagent。令人讨厌和神奇的是,superagent 会查看您传递给它的回调函数的数量。如果函数声明接受 2 个参数,则 superagent 符合 (error, result) 的节点约定,但是,如果回调函数看起来需要任何其他数量的参数(在与 async.js 一起使用的情况下为零),它会调用函数就像 callback(res) 我猜 TJ 认为这对浏览器会很好,但对于节点它完全打破了惯例。

有问题的确切代码行是here

【讨论】:

  • 我理解这会将cb 更改为function (err, res) { cb(err) },但它仍然无法按预期工作。我错过了什么吗?谢谢。
  • 请发布一个完整的更新示例。跟随孤立的 sn-p 太难了。当.end 是超级代理请求并且cb 是async.js 回调时,问题是.end(cb)。这需要一个额外的包装器:.end(function(err, res) {cb(err, res)}).
  • 您的问题似乎与github.com/tj/supertest/issues/126 更相关,github.com/tj/supertest/pull/137 可能已为代理损坏。
猜你喜欢
  • 1970-01-01
  • 2016-08-13
  • 2013-07-07
  • 2012-12-05
  • 2017-05-22
  • 2019-07-28
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多