Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用async await在Jest单元测试中等待表的创建/使其持久化?_Javascript_Sqlite_Unit Testing_Async Await_Jestjs - Fatal编程技术网

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中工作得非常好的示例。所以应该是内存数据库。。。