Javascript 如何使用async await在Jest单元测试中等待表的创建/使其持久化?
我有两张表,Javascript 如何使用async await在Jest单元测试中等待表的创建/使其持久化?,javascript,sqlite,unit-testing,async-await,jestjs,Javascript,Sqlite,Unit Testing,Async Await,Jestjs,我有两张表,制作人和联系人。要将信息添加到联系人表中,我必须首先将信息添加到生产者表中。这是我的单元测试: 'use strict' const Contacts = require('../modules/contacts.js') const Producers = require('../modules/producers.js') describe ('Add contact information()' , () => { test('Add contacts',
制作人
和联系人
。要将信息添加到联系人
表中,我必须首先将信息添加到生产者
表中。这是我的单元测试:
'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
函数创建producer
表时,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)
}
下面是正在制作的联系人表的代码:
'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)
}
我认为每个类都在创建自己的独立于其他类的内存中数据库 据 Every:memory:database与其他数据库不同。那么,开始二 每个文件名为“:memory:”的数据库连接将创建两个 独立的内存数据库
因此,要么在单个位置创建数据库并重用实例,要么使用链接中的某个方法在实体之间共享内存中的数据库。您可能需要检查在解析异步函数时是否创建了表?或者检查延迟从何而来?从构造函数中删除async并使用async类方法来执行db initasync构造函数:)@MartinChaov这是我的第一个猜测,但显然它们确实有效。下面是一个在Chrome中工作得非常好的示例。所以应该是内存数据库。。。