2013-10-10 47 views
3

我已閱讀this Q & A,並且已經試圖抓住我的代碼異常引發IntegrityError例外,這樣說:什麼是測試拋出IntegrityError的SQLAlchemy代碼的正確方法?

self.assertRaises(IntegrityError, db.session.commit()) 

但不知何故,我的單元測試仍然未能與IntegrityError異常停止。我希望它能說好,因爲我已經期望在我的單元測試中有例外。 這是由試圖插入具有相同唯一字段值的行的代碼引起的。

有什麼想法?

回答

4

其中一個意願的伎倆:

# ... only if version >= 2.7 
with self.assertRaises(IntegrityError): 
    db.session.commit() 

或者:

self.assertRaises(IntegrityError, db.session.commit) 

你的榜樣,並以正確的方式之間的區別是:

# Your example: You call db.session.commit(), this will raise an exception before 
# assertRaises is called 
self.assertRaises(IntegrityError, db.session.commit()) 

# Correct way: Pass what should be called to assertRaises, 
# let assertRaises invoke it and check for exception 
self.assertRaises(IntegrityError, db.session.commit) 

我更喜歡使用作爲上下文管理器使用assertRaises(使用with)。

+0

Phew ..這解決了,照亮我的一天!謝謝! :)對,我早些時候認爲參數接受函數名稱,而不是函數的調用。但是,不知何故,當我執行實際的代碼時,我錯過了這一點。但是,爲什麼你更喜歡使用上下文管理器?是不是與這一行結果將是相同的? – swdev

+0

新增了評論,我只是使用上下文管理器,正如你所指出的那樣,我認爲另一個好處是我們可以在該縮進塊中擴展/精煉我們的代碼。我仍然是新的Python,所以這就是我越來越:) – swdev

+1

我同意。我認爲使用assertRaises作爲上下文管理器使測試代碼更清晰。 – codeape

相關問題