#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 Category › Add 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(
категория уже зарегистрирована)