使用 Jest 测试 Adonis.js 应用时遇到的问题及解决方式

背景

Adonis.js 是一个优雅且现代的 Node.js web 框架,它使用 ES2017 的最新特性能力,具有类似于 Laravel 框架的优美的 API。 Jest 是一个基于 JavaScript 的测试框架,它旨在提供对自动化测试的快速、直接和可持续的开发体验。本文将探讨在使用 Jest 测试 Adonis.js 应用时遇到的问题及解决方式。

问题 1:如何 mock Adonis.js 中的服务

在 Jest 中,我们需要使用 jest.mockjest.fn() 等 API 来 mock 我们的模块,而 Adonis.js 中的服务通常是使用 IoC 容器被注入的,我们无法通过直接 require 的方式来 mock 需要注入的服务,因为依赖的这些服务已经被预先绑定了。

解决方式:

Adonis.js 的 Ioc 容器有一个 rebind 方法,我们可以使用这个方法来重新绑定我们需要的服务,以便进行 Mock。

const { ioc } = require('@adonisjs/fold')

const database = ioc.use('Adonis/Src/Database')

test('services should return object', async () => {
  database.rebind('Adonis/Src/Database', function () {
    return {
      schema: jest.fn()
    }
  })

  const services = await Services.getAll()
  expect(services).toEqual({
    data: [],
    pageNumber: 1,
    totalPages: 1,
  })
})

在这个例子中,我们重新绑定了 Adonis/Src/Database 服务,让它返回我们定义的 mock 对象,这样我们就可以在测试中使用这个 Mock 对象来达到我们的测试目的。

问题 2:如何测试 Express 中间件

在 Adonis.js 中,我们可以使用 Lucid 模型、Controller 还有 Middleware 等组件,比如使用 Middleware 来验证请求,通常为 authcsrf 等中间件,而在 Jest 测试中,如何实现对 Middleware 的 Mock 呢?

解决方式:

我们可以使用 Express 的中间件来 Mock 中间件。

const { ioc } = require('@adonisjs/fold')
const app = require('../../server')

// Mock middleware
const csrfMiddleware = (req, res, next) => {
  req.csrfToken = () => 'token';
  next();
};

describe('Article', () => {
  beforeAll(async () => {
    await Database.beginGlobalTransaction()
    await seed.run()
  })

  afterAll(async () => {
    await Database.rollbackGlobalTransaction()
  })

  beforeEach(async () => {
    await Factory.model('App/Models/Article').createMany(10)
    Route.get('/', async () => {
      return { success: true }
    }).middleware(['csrf'])
  })

  afterEach(async () => {
    await Database.truncate('articles')
    Route.clear()
  })

  test('should return articles', async () => {
    // Register middleware in app
    app.use(csrfMiddleware)

    const response = await supertest(app).get('/')
    expect(response.status).toBe(200)
  })
})

在这个测试用例中,我们通过注册中间件的方式来 mock 中间件,然后通过 supertest 来模拟 HTTP 请求,来达到测试我们的中间件的 Mock 目的。

总结

本文讨论了使用 Jest 时在 Adonis.js 中遇到的主要问题及解决方案。这些技巧可以帮助你编写更有效和更准确的测试,从而提高你的测试覆盖率和代码质量。当然,其他测试框架也可以使用类似的方法,希望这篇文章对你有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6595e03beb4cecbf2d9d627d


纠错反馈