Могу ли я иметь несколько тестов jest, подтверждающих один результат?

#javascript #unit-testing #jestjs

#javascript #модульное тестирование #jestjs

Вопрос:

Я хотел написать много небольших тестов, которые утверждают один result , который вычисляется только один раз, поэтому я написал эту структуру:

(обратите внимание на внешние beforeAll и beforeEach и внутренние beforeAll s)

 describe("service", ()=>{
  beforeAll(async ()=>{
    await initDb()
  })

  beforeEach(async ()=>{
    await resetConnection()
  })

  afterEach(async ()=>{
    await cleanDb()
  })

  describe("#getDetails", ()=>{
    describe("with a normal user", ()=>{
      let result

      beforeAll(async ()=>{
        const user = await createDbUserEntity()
        result = await service.getDetails(user)
      })

      it("should have a count of 1", ()=>{
        expect(result.count).toEqual(1)
      })

      it("should not have a relationship", ()=>{
        expect(result.rel).toNotBeDefined()
      })
    })

    describe("with two related users", ()=>{
      let result

      beforeAll(async ()=>{
        const user = await createDbUser({related: createDbUser()})
        result = await service.getDetails(user)
      })

      it("should have a count of 2", ()=>{
        expect(result.count).toEqual(1)
      })

      it("should have a relationship", ()=>{
        expect(result.rel).toEqual({foo:"bar"})
      })
    })

  })
})
 

К сожалению, внутреннее beforeAll запускается раньше внешнего beforeEach , так что на самом деле ничего не работает, потому что соединение не было сброшено при запуске внутреннего beforeAll.

Есть ли способ использовать Jest для написания этих крошечных тестов, которые я хочу? Where result вычисляется только один раз для группы тестов, поэтому я могу писать тесты, которые сформулированы точно так, как моя организация думает о наших бизнес-правилах?

Потому что при небольших тестах, подобных этому, отчет о тестировании заканчивается хорошими именами, такими как «service #getDetails с двумя связанными пользователями должен иметь количество 2«, что в точности соответствует знаниям домена моей организации.

Комментарии:

1. Не могли бы вы просто переместить resetConnection его туда же beforeAll ?

2. Вы действительно выполняете вызовы API со своими тестами?

3. @Pytth Я мог бы переместить вещи, да, но внешнее описание задает контекст «все они используют test-DB», а внутреннее описание задает контекст «эти тесты предназначены для метода getDetails», если я объединю beforeAll, я испорчу это разделение проблем. Мне бы очень хотелось сохранить блоки описания так, чтобы каждый из них вносил значимый контекст.

4. являются ли эти другие вызовы асинхронными? вы можете вернуть обещание из этих обратных вызовов

5. @Pytth тесты поддерживаются test-DB, поэтому здесь реализация service.getDetails() будет использовать DB. Фактический код имеет методы настройки для создания объектов БД, но я подумал, что этот код не так важен для моего примера. Рад добавить больше контекста, если вы скажете, что мое описание пока недостаточно значимо.