我正在使用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。我使用内存数据库,因此每次都需要格式化。 有什么建议如何实现预期的行为? 感谢。
答案 0 :(得分:1)
我应该仔细阅读Jest文档,我的案例有option权利。 我将数据库初始化的文件添加到" setupFiles"我的package.json中的数组,它工作正常。