13

私の属性の1つは、新しい値が無効な場合に例外を発生させる検証関数をセッターが呼び出すプロパティです。

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でいくつかの新機能を持っていることを知っています

4

2 に答える 2

17

unittest単なる関数呼び出しではなく、コードのブロックで例外が発生することをテストするために使用する場合assertRaisesは、コンテキストマネージャーとして使用できます。

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

この使用法は、unittestのドキュメントに記載されています。

これはPython2.6では利用できず、そのようには機能しませんが(私はあなたのメモを見たばかりです)、Python 2.7以降でこれを行うためのより明確な方法であるため、回答に含める価値があると思います。

于 2012-08-17T16:56:57.197 に答える
8

Python 2.7より前では、 setattr(object, name, value) docを使用します。これにより、属性に値を設定できます。

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

属性がプロパティであり、したがって「密かに」関数を呼び出す場合、それはクラス内にある必要があるため、これは常に機能するはずです。標準の割り当てが失敗することはないと思います(ただし、右側のx = 1/0は失敗する可能性があります。つまり)。

于 2012-08-17T16:27:13.823 に答える