簡體   English   中英

使用unittest測試作業失敗

[英]Testing failure of an assignment with unittest

我的一個屬性是一個屬性,其中setter調用驗證函數,如果新值無效則引發異常:

pos.offset = 0
# @offset.setter calls validate(offset=0)
# PositionError: Offset may not be 0.

我正在嘗試添加測試以確保此操作失敗。 但是,我無法弄清楚如何讓assertRaises與賦值一起工作。

assertRaises的正常語法需要一個方法,而不是一個屬性/屬性:

self.assertRaises(PositionError, pos.offset, 0)
# TypeError: 'int' object is not callable

我嘗試過的其他形式是無效的Python:

self.assertRaises(PositionError, pos.offset = 0)
# SyntaxError: Keyword can't be an expression
self.assertRaises(PositionError, lambda: pos.offset = 0)
# SyntaxError: lambda cannot contain assignment

如何測試對屬性的分配失敗?

注意:Python 2.6,我知道unittest在2.7中有一些新功能

如果要使用unittest測試代碼塊中發生異常而不僅僅是函數調用,可以使用assertRaises作為上下文管理器:

with self.assertRaises(PositionError):
    pos.offset = 0

這個用法可以在unittest docs中找到。

雖然這在Python 2.6中不可用,並且對你不起作用(我剛看到你的注釋),但我認為值得包含在答案中,因為對於python 2.7+來說這可能是更清晰的方法。

在Python 2.7之前,您要使用setattr(object, name, value) doc 這允許您為屬性設置值。

self.assertRaises(PositionError, setattr, pos, "offset", 0)
# ... ok

這應該始終有效,因為如果屬性是一個屬性,因此“秘密”調用一個函數,它必須在一個類中。 我認為標准賦值不會失敗(盡管右側的表達式可能會失敗,即x = 1/0 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM