试图通过模拟管道函数来测试文件的检索

时间:2016-06-10 14:13:54

标签: javascript node.js express pipe supertest

db对象来自cloudant模块。

这是我试图测试的代码:

res.set('some-header', 'some-value');
res.status(200);

db.attachment.get('some-uuid', 'file').
  on('error', function(e) {
     console.log('err');
     reject(e);
  }).
  pipe(base64.decode()).pipe(_res).on('error', function(e) {
     console.log('err2');
     reject(e);
  });

fulfill(null);

试图模仿上面的代码:

var sinon = require('sinon');
var request = require('supertest');

var attachment_1 = {
  get: sinon.stub(),
};
var db = {
  attachment: attachment_1
};

var obj = {};
var obj2 = {};
var sample = {};
obj.pipe = function(encoderfunction) {
  console.log('obj.pipe for encoding');
  return obj2;
};
obj2.pipe = function(res) {
  console.log('obj2.pipe');
  console.log(typeof res); // object
  return this;
};
obj2.on = function() {
  console.log('obj2');
};
sample.on = function() {
  console.log('sample.on');
  return obj;
};

db.attachment.get.withArgs('some-uuid', 'file').returns(sample);

这是实际测试:

it('should respond with file contents and status of 200', function(done) {
    request(app).get('/file/index.html')
      .expect(200)
      .end(function(err, res){
        if (err) {
          console.log(err);
        }
        console.log('res: ' + res);
        done();
    });
});

但我一直收到这个错误:

  1) should respond with file contents and status of 200:
     Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.

1 个答案:

答案 0 :(得分:0)

来自supertest文档:

  

如果您使用.end()方法.expect()失败的断言将   不抛出 - 他们会将断言作为错误返回给.end()   打回来。为了使测试用例失败,您需要重新抛出或   将错误传递给done(),如下所示:

describe('GET /users', function() {
  it('respond with json', function(done) {
    request(app)
      .get('/users')
      .set('Accept', 'application/json')
      .expect(200)
      .end(function(err, res) {
        if (err) return done(err);
        done();
      });
  });
});