swift - FMDB 单元测试是否成功创建表未通过

标签 swift fmdb

我想对 FMDB 是否成功创建表进行单元测试。

db.createGoodTable("good")
XCTAssertTrue(db.tableExists("good")!)

我不能通过考试。错误是:

 The FMDatabase <FMDatabase: 0x6080000bfb00> is not open.

所以我尝试在检查存在之前打开它:

db.createGoodTable()
db.open()
XCTAssertTrue(db.tableExists("good")!)

还是一样的错误。

PS:getDatabase 通过了单元测试,没有任何问题可以获取数据库。

func createGoodTable() {
        let sql = "create table if not exists good(name text)"
        guard let db = self.getDatabase("databaseName"), db.open() else {
            return false
        }
        do {
            try db.executeUpdate(sql, values: nil)
        } catch let er as NSError {
            print(er)
        }
        return db.close()
}

编辑

func getDatabase(_ dbName: String) -> FMDatabase? {
    let dbPath = databasePath + "/" + dbName
    guard FileManager.default.fileExists(atPath: dbPath) else {
        return nil
    }
    return FMDatabase(path: dbPath)
}

最佳答案

createGoodTable 中的 db 引用将本地 db 变量设置为新的 FMDatabase 实例,它是当 createGoodTable 返回时被丢弃。您的测试中的 db 引用从未打开。假设您已经创建了一个 FMDatabase 实例,只需打开它,不创建新实例也不创建局部变量:

func createGoodTable() -> Bool {
    let sql = "create table if not exists good(name text)"

    guard open() else {
        return false
    }

    do {
        try executeUpdate(sql, values: nil)
    } catch let er as NSError {
        print(er)
        close()
        return false
    }

    return close()
}

我从您的代码片段中推断出 createGoodTable 是在某些 FMDatabase 扩展或子类中实现的。如果没有,请向我们展示更多有关您如何定义和实例化 db 的信息。但基本思想是您要确保不会创建第二个本地 FMDatabase 实例,然后尝试在其他地方引用它。

关于swift - FMDB 单元测试是否成功创建表未通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45761429/

相关文章:

ios - TableView 未加载单元格

ios - 将值插入 fmdb 时出错

objective-c - Xcode 无法发出预编译 header ?

ios - TableView scrollToRow 阻塞了主 ui 线程

swift - DispatchWorkItem 不通知主线程

ios - 使用 SpriteKit 在 Swift 中将 GameCenter 与 NSNotification 集成 - ViewController 问题

iphone - 在同一后台线程上运行FMDB进程?

ios - Core Data 多对多 Swift

ios - FMDB 多线程问题

iphone - FMDB 如何在 Sqlite iPhone dev 上查询日期范围内的数据