背景
Adonis.js 是一个优雅且现代的 Node.js web 框架,它使用 ES2017 的最新特性能力,具有类似于 Laravel 框架的优美的 API。 Jest 是一个基于 JavaScript 的测试框架,它旨在提供对自动化测试的快速、直接和可持续的开发体验。本文将探讨在使用 Jest 测试 Adonis.js 应用时遇到的问题及解决方式。
问题 1:如何 mock Adonis.js 中的服务
在 Jest 中,我们需要使用 jest.mock
、jest.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 来验证请求,通常为 auth
、csrf
等中间件,而在 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