在准备好DB之前运行Jest测试

时间:2017-10-02 22:49:34

标签: node.js sqlite express supertest

我正在使用Jest使用SQLite数据库测试我的快速API,但出现了以下问题 - 测试在数据库准备好并创建表之前运行。

我使用以下代码连接到DB:

const prepareTables = async (db) => {
  // check existence of 'users' table
  try {
    const usersTable = await db.pGet("SELECT name FROM sqlite_master WHERE type='table' AND name='users'");
    if (!usersTable) {
      // create table
      db.pRun(`
        CREATE TABLE users (
          id TEXT,
          username TEXT,
          email TEXT,
          password TEXT
        )
      `);
    }
  } catch (err) {
    console.log('error', err); // eslint-disable-line no-console
  }
}

然后用

检查表的存在(并创建它们)
const createUser = async (req, res) => {
  // create user
  try {
    const newUser = {
      id: uuid.v4(),
      username: req.body.username,
      email: req.body.email,
      password: bcrypt.hashSync(req.body.password)
    }
    await db.pRun(`
      INSERT INTO USERS (id, username, email, password)
      VALUES (
        "${newUser.id}",
        "${newUser.username}",
        "${newUser.email}",
        "${newUser.password}"
      )
    `);
    const response = await db.pGet(`SELECT * FROM users WHERE id='${newUser.id}'`);
    delete response.password;
    res.status(200).send(response);
  } catch (err) {
    console.log(err); // eslint-disable-line no-console
    res.status(500).send("Unlucky, database error.");
  }
}

然后导出DB以便在API方法中使用。我的方法是:

it('should create new user', async (done) => {
    const res = await request(app)
      .post('/api/users/')
      .send({
        username: 'username',
        password: 'password',
        email: 'test@test.com'
      });
    expect(res.statusCode).toEqual(200);
    done();
  })

当服务器启动时它工作正常,我通过Postman手动调用它。但是我的测试:

select page, cat, hits from
    (select page, cat, hits 
     ,max(hits) over (partition by page) as m_hits 
     from pages) t
where m_hits = hits

没有工作抱怨桌子没有被创建。我控制了记录的数据库,这是真的。看起来在服务器成功启动和格式化表之前调用了API。我使用内存数据库,因此每次都需要格式化。 有什么建议如何实现预期的行为? 感谢。

1 个答案:

答案 0 :(得分:1)

我应该仔细阅读Jest文档,我的案例有option权利。 我将数据库初始化的文件添加到" setupFiles"我的package.json中的数组,它工作正常。