繁体   English   中英

如何使用 typescript 测试 koa 中间件

[英]How can I test koa middleware with typescript

我有很多中间件。 这是其中之一。 如何在 typescript 上测试我的中间件的类型合规性和 context.state 验证?


async function internationalizationPlugin(
  context: ParameterizedContext<AppState, AppContext>,
  next: Next
) {
  context.state.i18n = await (i18next as any).createInstance({
    lng: context.state.language,
    fallbackLng: 'en',
  })
  await next()
}

linter 将检查类型合规性,并将能够对其进行更多自定义。 但是,您只需确保将 function 导出到您的测试文件,然后运行不是 100% 复制/可粘贴代码的expect(typeof context).to.be(ParameterizedContext<AppState, AppContext>) ,但是,我认为这是在正确的轨道上。 此外,为了可测试性,如果您从中间件创建 class 可能会更容易,这样导入和测试就更容易了。

这是我的简单类型支持解决方案。 我不确定它是否适合所有人。

import * as httpMocks from 'node-mocks-http'
import * as Koa from 'koa'

export interface MockContext<RequestBody = undefined> extends Koa.Context {
  request: Koa.Context['request'] & {
    body?: RequestBody
  }
}

export const koaMockContext = <
  State = Koa.DefaultState,
  Context = MockContext,
  RequestBody = undefined
>(
  requestBody?: RequestBody
) => {
  const req = httpMocks.createRequest()
  const res = httpMocks.createResponse()
  const app = new Koa<State, Context>()
  const context = app.createContext(req, res) as MockContext<RequestBody> & Koa.ParameterizedContext<State, Context>
  res.statusCode = 404
  context.request.body = requestBody
  return context
}

和例子

import { AppContext, AppState } from './types'
import { koaMockContext } from './utils'
import { internationalizationPlugin } from '../src/internationalizationPlugin'

describe('internationalizationPlugin', () => {
  const ctx = koaMockContext<AppState, AppContext>()

  it('should not be undefined', async () => {
    await internationalizationPlugin(ctx, async () => {})
    expect(ctx.state.i18n).not.toBe(undefined)
  })
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM