Factorify 소개 - Node.js용 모델 팩토리 라이브러리

10938 단어 nodetesting
각 테스트의 처음 15-20줄이 여러 모델을 사용하여 데이터베이스 상태를 설정하는 데만 사용되는 테스트를 작성한 적이 있습니까?

이것이 바로 Factorify가 해결하려는 문제입니다.


Adonis.js 또는 Laravel을 이미 사용했다면 모델 팩토리의 개념이 매우 친숙할 것입니다. 여기의 아이디어는 정확히 동일합니다. Factorify는 그것에서 완전히 영감을 받았습니다.

Model Factory가 다른 스택에서 작업하는 동안 테스트를 수행하는 데 정말 놓쳤던 도구라는 것을 빨리 깨달았기 때문에 Factorify를 구축했습니다(현재 작업해야 하는 스택은 Hasura/AWS Lambda입니다).

Factorify를 사용하는 대부분의 시간은 ORM 없이 스택에서 작업하거나 ORM이 동등한 기능을 제공하지 않는 경우 관련이 있습니다. 그러나 좋은 ORM이라면 어느 정도 유사한 시스템을 제공해야 합니다.

예를 들어 지금 멋진 아이들을 위한 ORM인 MikroORM은 공장을 제공합니다: https://mikro-orm.io/docs/seeding#entity-factories

Prisma ORM에는 내장 솔루션이 없는 것 같지만 다음에 대한 타사 플러그인이 있습니다. https://github.com/echobind/prisma-factory

Adonis.js의 ORM인 Lucid에도 모델 팩토리가 있습니다. https://docs.adonisjs.com/guides/models/factories

등.

Factorify는 사용이 매우 간단합니다. 게시물을 짧게 유지하기 위해 데이터베이스 구성 단계를 건너뛰지만 문서 웹 사이트에서 자세한 정보를 찾을 수 있습니다. https://factorify.julr.dev/

첫 번째 단계는 각 모델에 대한 요인을 간단히 정의하는 것입니다. 여기서 우리는 세 가지 모델, 사용자, 게시물 및 댓글이 있는 데이터베이스에서 작업할 것입니다.
사용자는 여러 게시물을 가질 수 있으며 게시물에는 여러 댓글이 있을 수 있습니다.

우리는 팩토리를 정의하는 것으로 시작합니다. 팩토리와 팩토리 간의 관계는 다음과 같습니다.

export const CommentFactory = defineFactory('comment', ({ faker }) => ({
  content: faker.lorem.paragraph(),
}))
  .build()

export const PostFactory = defineFactory<>('post', ({ faker }) => ({
  title: faker.lorem.sentence(),
}))
  // 👇 We define a relationship between the post and the comment model
  .hasMany('comments', () => CommentFactory)
  .build()

export const UserFactory = defineFactory<any>('user', ({ faker }) => ({
  id: faker.datatype.number(),
  name: faker.name.fullName(),
  role: 'user'
}))
  .state('admin', () => ({ role: 'admin' }))
  // 👇 We define a relationship between the user and the post model
  .hasMany('posts', () => PostFactory)
  .build()


그리고 그게 다야! 깨끗한 테스트를 작성할 준비가 되었습니다.
모든 테스트에서 이제 팩토리를 사용하여 필요한 데이터베이스 상태를 생성할 수 있습니다.

import { UserFactory } from '../factories.js'

test('My test ', () => {
  // 👇 We create 3 users, each with 2 posts, and each post with 3 comments
  const user = await UserFactory
    .with('posts', 2, posts => posts.with('comments', 3))
    .createMany(3)

  // 👇 We can also create a single admin user by applying the previously defined state
  const admin = await UserFactory.apply('admin')
    .with('posts', 4)
    .create()

  // Now you can focus on testing your business logic, without having to write
  // 15 lines of code to create the database state you need 🎉
})


그리고 당신은 간다. 이렇게 하면 테스트 작성이 훨씬 쉽고 깔끔해집니다!

Factorify는 다음과 같은 많은 다른 멋진 기능을 숨깁니다.
  • 스터빙: 데이터베이스에 아무 것도 유지하지 않고 모델을 메모리로 반환하기만 하면 됩니다. API 테스트에 유용합니다. 모델을 생성하고 변수에 저장하고, supertest 등을 사용하여 API로 보냅니다.

  • test('Should insert user', () => {
      // 👇 Calling `make` or `makeMany` will generate the model in memory, without persisting it in the database
      const user = await UserFactory.make()
    
      request(app).post('/users').send(user).expect(200)
    })
    


  • 속성 재정의: 전체 팩터리를 재정의하지 않고도 모델의 속성을 재정의할 수 있습니다.

  • // 👇 We override the name attribute of the user
    const user = await UserFactory.merge({ name: 'Julien' }).create()
    


    그리고 설명서 웹 사이트에서 찾을 수 있는 몇 가지 다른 기능: https://factorify.julr.dev/


    Factorify가 유용하길 바라며 피드백이 있으면 알려주세요! 또한 프로젝트에 기여하고 싶다면 모든 PR에 열려 있습니다.

    여기 GitHub에서 프로젝트를 찾을 수 있습니다: https://github.com/julien-r44/factorify/
    💖을 보여주시고 마음에 드시면 프로젝트에 별표를 표시해 주시면 프로젝트에 대한 가시성을 높이는 데 많은 도움이 됩니다.

    좋은 웹페이지 즐겨찾기