测试 returns next() / next("route") 的快速中间件
Testing express middleware that returns next() / next("route")
我创建了这个中间件,当路由的唯一参数由 queryItems
定义时,它将 return next()
。
我最近发现 node-mocks-http 伪造表达 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-as-promised?
Note: _.hasOnly is a custom underscore 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))
将中间件转换为与 express-promise-router
一起使用的承诺。
middleware.hasOnlyQuery = function(queryItems){
return function(req, res){
if(typeof queryItems == "string") queryItems = [queryItems]
if(_.hasOnly(req.query, queryItems)) return Promise.resolve('next')
return Promise.resolve('route')
}
}
新测试使用chai-as-promised
and bluebird
:
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()
})
})
我喜欢 Sinon 这样的测试:
// 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;
我创建了这个中间件,当路由的唯一参数由 queryItems
定义时,它将 return next()
。
我最近发现 node-mocks-http 伪造表达 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-as-promised?
Note: _.hasOnly is a custom underscore 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))
将中间件转换为与 express-promise-router
一起使用的承诺。
middleware.hasOnlyQuery = function(queryItems){
return function(req, res){
if(typeof queryItems == "string") queryItems = [queryItems]
if(_.hasOnly(req.query, queryItems)) return Promise.resolve('next')
return Promise.resolve('route')
}
}
新测试使用chai-as-promised
and bluebird
:
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()
})
})
我喜欢 Sinon 这样的测试:
// 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;