Javascript 测试返回next()/next(“路由”)的express中间件

Javascript 测试返回next()/next(“路由”)的express中间件,javascript,unit-testing,express,mocha.js,middleware,Javascript,Unit Testing,Express,Mocha.js,Middleware,我创建了这个中间件,当路由的唯一参数由queryItems定义时,它将返回next() 我最近发现哪些赝品表达了req和res对象。但是,它不会伪造next。我想知道该怎么做?下面是我打开next回调并在其中定义expect语句的示例 middleware.hasOnlyQuery = function(queryItems){ return function(req, res, next){ if(typeof queryItems == "string") queryItems

我创建了这个中间件,当路由的唯一参数由
queryItems
定义时,它将返回
next()

我最近发现哪些赝品表达了
req
res
对象。但是,它不会伪造
next
。我想知道该怎么做?下面是我打开
next
回调并在其中定义
expect
语句的示例

middleware.hasOnlyQuery = function(queryItems){
  return function(req, res, next){
    if(typeof queryItems == "string") queryItems = [queryItems]
    if(_.hasOnly(req.query, queryItems)) return next()
    return next("route")
  }
}
这是测试

it("should only have shop query", function(done){
  var req = httpMocks.createRequest({
      method: 'GET',
      query: {
        foo: "bar"
      }
  });
  var res = httpMocks.createResponse()
  var fn = middleware.hasOnlyQuery(["foo"])(req, res, function(err){
    expect(err).to.equal()
    return done()
  })
})

it("should not only have shop query", function(done){
  var req = httpMocks.createRequest({
      method: 'GET',
      query: {
        foo: "bar",
        bar: "foo"
      }
  });
  var res = httpMocks.createResponse()
  var fn = middleware.hasOnlyQuery(["foo"])(req, res, function(err){
    expect(err).to.equal("route")
    return done()
  })
})
这是正确的方法吗?有没有办法让这更简单/更容易,或者把它转换成承诺,这样我就可以像承诺的那样使用chai

注意:是一个自定义下划线mixin


一种使这一过程更为顺利的方法是创建“下一步”可能有的三种响应

function nextNormal(done){
  return function(err){
    expect(err).to.equal(undefined)
    return done()
  }
}

function nextRoute(done){
  return function(err){
    expect(err).to.equal("route")
    return done()
  }
}

function nextError(done){
  return function(err){
    expect(err).to.be.an('object')
    return done()
  }
}
然后你可以在一行中使用它

middleware.hasOnlyQuery(["foo", "bar"])(req, res, nextNormal(done))

将中间件转换为与一起使用的承诺

新测试使用和:

我喜欢这样的测试:

// first test
...
var res = httpMocks.createResponse()
var spy = sinon.spy();
middleware.hasOnlyQuery(["foo"])(req, res, spy);
expect(spy.calledWithExactly()).to.be.true;

// second test
...
expect(spy.calledWithExactly('route')).to.be.true;
it("should fire correct next callback", function(done){
  Promise.all([
    middleware.hasOnlyQuery(["foo"])(reqFoo, res).should.eventually.equal("next"),
    middleware.hasOnlyQuery(["foo", "bar"])(reqFoo, res).should.eventually.equal("route"),
    middleware.hasOnlyQuery(["foo", "alpha"])(reqFoo, res).should.eventually.equal("route"),
    middleware.hasOnlyQuery(["foo"])(reqFooBar, res).should.eventually.equal("route"),
    middleware.hasOnlyQuery(["foo", "bar"])(reqFooBar, res).should.eventually.equal("next"),
    middleware.hasOnlyQuery(["foo", "alpha"])(reqFooBar, res).should.eventually.equal("route")
  ]).then(function(){
    done()
  })
})
// first test
...
var res = httpMocks.createResponse()
var spy = sinon.spy();
middleware.hasOnlyQuery(["foo"])(req, res, spy);
expect(spy.calledWithExactly()).to.be.true;

// second test
...
expect(spy.calledWithExactly('route')).to.be.true;