【问题标题】:How can I test koa middleware with typescript如何使用 typescript 测试 koa 中间件
【发布时间】:2020-03-08 23:37:17
【问题描述】:

我有很多中间件。这是其中之一。如何在 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()
}

【问题讨论】:

    标签: javascript typescript jestjs koa koa2


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢。但是你不能比较值和类型。 typeof context - objectParameterizedContext&lt;AppState, AppContext&gt; - type definition
      猜你喜欢
      • 2017-08-16
      • 2020-05-19
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 2018-03-10
      • 2014-10-12
      • 2017-07-27
      • 2021-04-29
      相关资源
      最近更新 更多