Jest возвращает таблицу не найдена ошибка с sqlite - PullRequest
0 голосов
/ 17 января 2020

Я написал набор тестов и использую Sequelize в качестве ORM и Jest в качестве тестера.

Моя конфигурация Sequelize выглядит следующим образом:

{
  "development": {
    "dialect": "sqlite",
    "storage": "dev.sqlite"
  },
  "test": {
    "dialect": "sqlite",
    "storage": ":memory:"
  },
}

Моя package.json выглядит следующим образом:

    "test": "jest --setupFiles dotenv/config",
    "pretest": "yarn migrate && yarn seed",
    "migrate": "cd server && npx sequelize-cli db:migrate",
    "migrate:reset": "cd server && npx sequelize-cli db:migrate:undo:all --env test && npm run migrate --env test",
    "seed": "cd server && npx sequelize-cli db:seed:all --env test",
    "test:debug": "node --inspect node_modules/.bin/jest",

Мои установочные файлы Jest просто гарантируют, что среда Node test.

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

SequelizeDatabaseError: SQLITE_ERROR: no such table: Users. Это то же самое для каждой используемой таблицы.

Я подозреваю, что проблема в том, что, когда соединение закрывается, база данных в памяти прерывается, поэтому я попытался запустить миграцию базы данных и заполнить для каждого теста основа, но это не сработало. Аналогично для использования фактического test.sqlite файла.

Любой совет?

Пример моего регистрационного теста:

import { getMaxTokenAge } from '../../../utils/auth'
import sinon from 'sinon'
import mutation from '../register'
import models from '../../../models/'

import query from '../getUser'

describe('register', () => {
  describe('resolver', () => {
    const res = {
      cookie: jest.fn(),
    }
    const userInfo = {
      email: 'test@example.com',
      firstName: 'First',
      lastName: 'Last',
      phone: '0123456789',
      orgName: 'Org Name',
      organization: 'none',
      password: 'secret123',
      newOrganization: {
        name: 'Org Name',
        type: 'buyer',
      },
    }

    test('guests can register', async () => {
      // Get the role and type of a buyer
      const buyerRole = await models.UserRole.findOne({
        where: {
          name: 'buyer',
        },
        raw: true,
      })

      const someBuyerType = await models.UserType.findOne({
        where: {
          name: 'somebuyer',
        },
        raw: true,
      })

      // Take the ids for role and type and add them to our user info to submit
      userInfo.role = someRole.id
      userInfo.type = someType.id

      await mutation({}, userInfo, {
        context: {},
        models,
        req: {},
        res,
      })

      expect(
        await query({}, { email: userInfo.email }, `{ email, id }`),
      ).toMatchSnapshot({
        createdAt: expect.any(Date),
        updatedAt: expect.any(Date),
        id: expect.any(String),
        password: expect.any(String),
        UserRoleId: expect.any(String),
        UserTypeId: expect.any(String),
      })

      expect(res.cookie).toHaveBeenCalledWith('token', expect.any(String), {
        maxAge: getMaxTokenAge(),
        httpOnly: true,
      })
    })

    test('throws an error when trying to register with an email that belongs to an existing user', async () => {
      models.User.findOne = sinon.stub().resolves(true)

      await expect(
        mutation({}, userInfo, {
          models,
          req: {},
          res,
        }),
      ).rejects.toThrowErrorMatchingInlineSnapshot(
        `"A user already exists with this email address."`,
      )
    })
  })
})

и регистрационный код:

/**
 * @param {*} parent
 * @param {string} email
 * @param {string} password
 * @param {*} args
 * @param {*} context
 *
 * @example
 * ```
 * register(
 *  email: "${user.email}"
 *  password: "secret123"
 *  organization: "none"
 *  firstName: "${user.firstName}"
 *  lastName: "${user.lastName}"
 *  phone: "0123456789"
 *   newOrganization: {
 *     name: "${user.orgName}"
 *     type: "buyer"
 *   }
 * ) {
 *  token
 *  user {
 *   email
 *  }
 * }
 * ```
 */
const register = async (
  root,
  {
    email,
    password,
    firstName,
    lastName,
    phone,
    organization,
    newOrganization,
    role,
    type,
  },
  { models, res, req },
) => {
  const encryptedPassword = await bcrypt.hash(password, 10)

  const exists = await models.User.findOne({ where: { email } })

  if (exists) {
    throw new DatabaseError('A user already exists with this email address.')
  }

  const user = await models.User.create({
    email,
    password: encryptedPassword,
    firstName,
    lastName,
    phone,
  })

  await user.setUserRole(role)

  await user.setUserType(type)

  const token = jwt.sign(
    {
      userId: user.id,
    },
    process.env.JWT_SECRET,
  )


  res.cookie('token', token, {
    maxAge: getMaxTokenAge(),
    httpOnly: true,
  })

  req.user = user

  return user
}

export default register

1 Ответ

0 голосов
/ 22 апреля 2020

У меня была похожая проблема с тестированием моих db-таблиц и моделей. Я решил это, добавив этот код:

    await User.sync({ force: true });
...