2015-07-09 3 views
1

Я создал этот компонент промежуточного программного обеспечения, который вернет next(), когда только параметры для маршрута определены queryItems.Тестирование экспресс-промежуточного программного обеспечения, которое возвращает next()/next («route»)

Я недавно нашел 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-обещал?

Примечание: _.hasOnly является обычным миксером подчеркивания.

ответ

1

Мне нравится 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; 
0

Один из способов сделать эту гладкость - создать три вида ответов «следующий может иметь.

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)) 
0

Преобразование промежуточного ПО на обещание использовать с 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 и 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() 
    }) 
})