如何使用async await在Jest单元测试中等待表的创建/使其持久化



我有两个表,producerscontacts。要将信息添加到contacts表中,我必须首先将信息添加至producers表中。这是我的单元测试:

'use strict'
const Contacts = require('../modules/contacts.js')
const Producers = require('../modules/producers.js')

describe ('Add contact information()' , () => {
test('Add contacts', async done => {
expect.assertions(6)
const producer = await new Producers()
await producer.addProducer('James')
const contact = await new Contacts()
await contact.addContacts('James', 'www.johnwick.com', 'john@johnwick.com', '07724890765', '24, John Wick Street, London')
const data = await contact.getAll()
await expect (data.length).toBe(1)
expect (data[0].ProducerID).toBe(1)
expect (data[0].ProducerWebsite).toBe('www.johnwick.com')
expect (data[0].ProducerEmail).toBe('john@johnwick.com')
expect (data[0].ProducerNumber).toBe('07724890765')
expect (data[0].ProducerAddress).toBe('24, John Wick Street, London')
done()
})
})

问题是,当使用addProducer函数创建producers表时,addContacts函数无法使用它。我该如何解决这个问题?以下是来自Jest单元测试的反馈:

FAIL  unit tests/contacts.spec.js
Add contact information()
× Add contacts (80ms)
● Add contact information() › Add contacts
SQLITE_ERROR: no such table: producers

console.log modules/producers.js:22
Add Producer James
console.log modules/producers.js:32
Producer successfuly added.
console.log modules/producers.js:67
[ { ProducerID: 1, ProducerName: 'James' } ]

正如您所看到的,它确实创建了它,但只有在抛出错误之后??

这是正在制作的生产者表的代码:


'use strict'
const sqlite = require('sqlite-async')
module.exports = class Producers {

//Create Database Table if it doesn't exist
constructor(dbName = ':memory:') {
return (async() => {
this.db = await sqlite.open(dbName)
const sql = 'CREATE TABLE IF NOT EXISTS producers(ProducerID INTEGER PRIMARY KEY UNIQUE, ProducerName TEXT NOT NULL UNIQUE)'
await this.db.run(sql)
return this
})()
}
//Add function to add producers to database if not existing or add product types if producer exists. 
async addProducer(name) {
console.log('Add Producer', name)

//Check if there are any Producers with the same name
let sql = `SELECT * FROM producers WHERE ProducerName="${name}"`
const data = await this.db.all(sql)

//If producer doesn't exist add to database
if(data.length === 0) {
sql = `INSERT INTO producers (ProducerName) VALUES("${name}")`
await this.db.run(sql)
console.log('Producer successfuly added.')
}

//Else return error saying producer exists
else {
console.log('Producer already exists.')
throw new Error ('Producer already exists.')
}
}

这是正在制作的联系人表的代码:


'use strict'
const sqlite = require('sqlite-async')
module.exports = class Contacts {

//Create Database Table if it doesn't exist
constructor(dbName = ':memory:') {
return (async() => {
this.db = await sqlite.open(dbName)
const sql = 'CREATE TABLE IF NOT EXISTS contacts(ProducerID INTEGER, ProducerWebsite TEXT, ProducerEmail TEXT, ProducerNumber INTEGER, ProducerAddress TEXT)'
await this.db.run(sql)
return this
})()
}
async addContacts (ProducerName, ProducerWebsite, ProducerEmail, ProducerNumber, ProducerAddress){
// if(isNaN(Number.parseInt(ProducerNumber))) throw new Error('The Producer Number cannot contain letters')
let sql = `INSERT INTO contacts (ProducerID, ProducerWebsite, ProducerEmail, ProducerNumber, ProducerAddress) VALUES (
(SELECT ProducerID FROM producers WHERE ProducerName="${ProducerName}"), 
"${ProducerWebsite}", "${ProducerEmail}", "${ProducerNumber}", "${ProducerAddress}")`
await this.db.run(sql)
}

我认为每个类都在独立于其他类创建自己的内存数据库。

根据https://www.sqlite.org/inmemorydb.html

Every:memory:数据库彼此不同。所以,打开两个每个数据库连接的文件名为":存储器:";将创建两个独立的内存数据库。

因此,要么在一个地方创建数据库并重用实例,要么使用链接中的一个方法在实体之间共享内存中的数据库。

相关内容

最新更新