тест завершается неудачно

#javascript #node.js #oop #jestjs

#javascript #node.js #ооп #jestjs

Вопрос:

У меня возникла проблема с тестированием моего приложения (для исследований), когда в базе данных есть одинаковое имя категории. Хотя категория не добавляется в таблицу снова, тест не проходит.

Когда я добавляю новую категорию, которой нет в банке, появляется сообщение об ошибке сопоставления: полученное значение должно быть функцией, но чего ожидать, невозможно проверить переменную?

И я не знаю, где я могу ошибаться

класс DAO

 export default class CategoryDAO {
  constructor(conn) {
    this._conn = conn
  }
  async add(category) {
    if (!(category instanceof Category)) {
      throw new Error("The object is not of type category")
    }
    try {
      const categories = await this._conn.query(`SELECT * FROM category`)
      
      if (categories.some(c => c.name === category.name)) {
        throw new Error("The category has already been registered")
      }
      await this._conn.query(`INSERT INTO category (name) VALUES (?)`, [category.name])
    } catch (error) {
      throw new Error(error)
    }
  }
}

 

Тест

 describe("Tests for Class Category", () => {
  let conn = new Connection()

  beforeAll(async () => {
    await conn.conect()
  });

  afterAll(async () => {
    await conn.close();
  })

  it("Creating author successfully", async () => {
    const categoryDAO = new CategoryDAO(conn)
    const category = new Category("Devops")
    await categoryDAO.add(category)
    expect(category.name).toBeDefined()
  })

  it("Add must throw error when another author is registered", async () => {
    const categoryDAO = new CategoryDAO(conn)
    const category = new Category("Devops")
    await categoryDAO.add(category)
    expect( category).toThrow(new Error(`The category has already been registered`))
  })
 

Журнал

 Tests for Class CategoryAdd must throw error when another author is registered

    Error: The category has already been registered

      17 |       await this._conn.query(`INSERT INTO category (name) VALUES (?)`, [category.name])
      18 |     } catch (error) {
    > 19 |       throw new Error(error)
         |             ^
      20 |     }
      21 |   }
      22 | }
 

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

1. expect(category) ничего не делает. Он просто смотрит на переменную. Вы имеете в виду что-то с этим делать? Вы имели в виду expect(await categoryDAO.add(category)).toThrow(...) ?

2. возможно, для этого вам придется использовать функцию со стрелкой

3. ПРИВЕТ, @tadman, спасибо за ваш ответ. Я уже пробовал этот способ, но получаю ту же ошибку expect(received).toThrow(expected) Matcher error: received value must be a function Received has value: undefined 25 | const category = new Category("Devopss") 26 | //await categoryDAO.add(category) expect(await categoryDAO.add(category)).toThrow(new Error(`The category has already been registered`))

4. Я думаю, что у Дэниела правильная идея.

5. Но @DanielA. Белый и тадман, я уже в функции со стрелкой, не так ли?

Ответ №1:

Это дикое предположение, но оно основано на шаблоне в документации, на которую вы ссылались:

 await expect(categoryDAO.add(category)).rejects.toThrow({
  ... // Your error.
});
 

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

1. Спасибо! @tadman Я так много раз тестировал его с помощью rejects и expect, но expect ничего не сделал только с категорией. Это сработало toThrow следующим образом: await expect(categoryDAO.add(category)).rejects.toThrow( категория уже зарегистрирована )