2012-10-31 39 views
0

發佈了jQuery論壇http://forum.jquery.com/topic/how-do-i-test-for-web-sql-exceptions但認爲我會問這裏。我正在嘗試針對我正在開發的Web SQL API編寫單元測試。我試圖說明的情況是參數未被提供時。下面是一些示例代碼:如何測試Web SQL異常?

的Web SQL輔助對象:

var sql = function() { 
return { 
    getDb: function() {    
     return openDatabase("sampleDb", "1.0", "sampleDb", 5 * 1024 * 1024); 
    }, 

    initDb: function() { 
     var db = this.getDb(); 
     if (db) { 
      db.transaction(function (tx) { 
       tx.executeSql("CREATE TABLE IF NOT EXISTS SampleTable (Key TEXT UNIQUE NOT NULL,Value TEXT NOT NULL)"); 
      }); 
     } 
    }, 

    insertRecord: function (key, value) { 
     var db = this.getDb(); 
     if (db) { 
      db.transaction(function (tx) { 
       tx.executeSql("INSERT INTO SampleTable (Key, Value) VALUES (?, ?)", [key, value], 
        function() { 
        }, 
        function (tx, error) { 
         throw (error.message); 
        }); 
      }); 
     } 
    } 
} 

}();

下面是我的單元測試:

asyncTest("test1", function() { 
raises(function() { 
    sql.initDb(); 
    sql.insertRecord(null, null); 
    start(); 
}, 
"exception expected"); 

});

我期待一個異常被拋出,因爲鍵和值參數沒有被提供;然而,當測試完成執行時,它表示不會拋出異常。雖然我沒有明確地拋出一個異常,但是引發了一個異常,因爲動態生成的sql語句不能在沒有提供鍵和值參數的情況下執行。

是否有可能編寫測試考慮到這些類型的場景?

+0

引發應拋出? –

+0

它看起來像有兩種測試錯誤的方法。拋出(http://api.qunitjs.com/throws/)並引發(http://docs.jquery.com/QUnit/raises)。 –

回答

0

爲什麼不試異步異常測試第一?據我所知,你的測試與WebSQL無關。

而且qunit異步測試可以調用start()之前需要expect()。如果不是,所有的測試都會通過,而不需要等待異步工作流程。

+0

我不太明白你在說什麼。我更新了代碼示例,以便對insertRecord的調用引發錯誤。該測試實際上涉及到的Web SQL,因爲調用insertRecord應該拋出這是在錯誤回調左撇子產生的異常:功能(TX,錯誤){ 擲(返回Error.message); }) –

+0

我的意思是insertRecord函數應該被簡單的異步代替並首先測試它。例如:'insertRecord = function(){setTimeout(function(throw'e');)}' –