FMDB单元测试是否成功创建表没有通过

时间:2017-08-18 16:46:50

标签: 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)
}

1 个答案:

答案 0 :(得分:1)

db中的createGoodTable引用正在将一个本地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实例,然后尝试在其他位置引用它。