-
-
Save yamalight/370306d4027d70dcf29650be9db30f91 to your computer and use it in GitHub Desktop.
const test = require('tape'); | |
const koa = require('koa'); | |
const supertest = require('supertest'); | |
const app = koa(); | |
app.use(function *(){ | |
this.body = 'Hello World'; | |
}); | |
let server; | |
let request; | |
test('Start server', t => { | |
server = app.listen(); | |
request = supertest(server); | |
t.end(); | |
}) | |
test('Koa test', t => { | |
request | |
.get('/') | |
.expect(200) | |
.end((err, res) => { | |
if (err) throw err; | |
t.equals(res.text, 'Hello World'); | |
t.end(); | |
}); | |
}); | |
test('Shutdown server', t => { | |
server.close(); | |
t.end(); | |
}) |
@polRk it's best to test the implementation, not specific details - just do request(s) and test that server returns expected things.
@polRk it's best to test the implementation, not specific details - just do request(s) and test that server returns expected things.
The server always returns OK.
This is about context.state and a handler that makes requests to another server.
See https://stackoverflow.com/questions/58832594/how-can-i-test-koa-middleware-with-typescript
@polRk your middleware still does something during one of the requests, right? if it's an i18n plugin - it'll return localized strings. so that's what you should be testing - switch locales and make sure requests actually get localized data back
This plugin is for translating strings that will be sent via axios to another server. My server always returns OK
And I am testing language detection. And for this I need to check my middleware work
@polRk then intercept that request and make sure it is correct
It's not a request, but a language detection
Another example
async function payloadPlugin(
context: Koa.ParameterizedContext<AppState, AppContext>,
next: Koa.Next
) {
if (context.state.update?.data) {
context.state.payload = JSON.parse(context.state.update.data)
}
await next()
}
export { payloadPlugin }
I need to test the transmitted data between middleware at each step
@polRk you said:
plugin is for translating strings that will be sent via axios to another server
I pointed out that you should test that outgoing request.
For second example - once again, I'd test the place where it's being used, not the middleware itself.
Integration tests are generally way more valuable than unit tests.
I have about 700 middleware. I need to check them all individually. And i have Integration tests. I need unit tests.
I pointed out that you should test that outgoing request.
This is just one middleware in a large middleware chain
@polRk looks like I cannot help you here then.
but if you already have integration test - your middleware should be already covered by them
Simple middleware chain.
const middlewareList = new Map<
string,
Koa.Middleware<AppState, AppContext>
>()
.set('100_LoadUpdate', updatePlugin)
.set('200_LoadState', statePlugin)
.set('300_LoadPayload', payloadPlugin)
.set('400_LoadInternationalization', internationalizationPlugin)
server.use(mount('/app', createApp(middlewareList)))
server.use(ctx => {
ctx.body = 'OK'
})
but if you already have integration test - your middleware should be already covered by them
The fact is that they are not all used. They connect as needed. This is a large number of plugins that should work independently.
@polRk one simple option would be to construct new app for each middleware inside tests and test it that way
@polRk one simple option would be to construct new app for each middleware inside tests and test it that way
Yes, you are right! But how can i test context.state ?
expect(context.state.key).toBe('value')
Yes, you are right! But how can i test context.state ?
Maybe like this ?
server.user(internationalizationPlugin)
server.use(ctx => {
ctx.body = ctx.state
})
@polRk return it as a response?
Can u give an example of testing koa context.state ?