有一个非常基本的中间件,我想测试一下。
第一个问题是我正在使用什么样的测试。根据我的理解,我无法为此代码编写单元测试。 我称之为集成测试。这是对的吗?
第二个问题是测试本身:我遇到了超时,但我已经使用了done()
。
我究竟做错了什么?这是测试这个中间件的正确方法吗?
/middlewares/graphql.js
module.exports = (req, res, next) => {
res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With')
if (req.is('application/graphql')) {
req.body = { query: req.body }
}
if (req.method === 'OPTIONS') {
res.sendStatus(200)
} else {
next()
}
}
/tests/middlewares/graphql.js
import nodeMocks from 'node-mocks-http'
import middleware from '../middlewares/graphql'
describe('GraphQL middleware', () => {
it('Should return 200 for valid Content-Type header', (done) => {
const req = nodeMocks.createRequest({
headers: {
'Content-Type': 'application/graphql'
},
body: {
content: 'anything'
},
method: 'OPTIONS'
})
const res = nodeMocks.createResponse()
middleware(req, res, (err) => {
expect(res.statusCode).toEqual(200)
expect(res.body.content).toEqual('anything')
expect(err).toBeNull()
done()
})
})
})
答案 0 :(得分:1)
middleware
是一个以(req, res, next)
为参数的函数。您发送req
,res
以及处理断言的回调。即断言测试以next()
传递。
但是当你传递next()
作为请求方法时,没有理由调用OPTIONS
。然后,中间件将执行res.sendStatus(200)
。因此,您必须将中间件称为普通函数(对于此特定测试)。
middleware(req, res);
expect(res.statusCode).to.equal(200);
expect(res.body.content).to.equal('anything');
done();
除了res.body
之外,它会失败,但那是因为中间件函数是这样编写的。
只要您只测试中间件功能,我就称之为单元测试。如果您关心next()
被调用后会发生什么,我会称之为集成测试。但是,只要它经过测试,它所称的并不重要。
当中间件必须调用next()
时,您可以看到this答案进行测试。