1

try exceptPython のモジュールの関数定義の外で定義されているブロックの Python 3 unittest の書き方を知りたいです。

package/module.pyのようなコード ブロックがあるとします。

OS のインポート

try:
  CONSTANT = os.environ['NOT_EXISTING_KEY']
except KeyError:
  CONSTANT = False
finally:
  del os

(実際のコードは気にしないでください。os.getenv('NOT_EXISTING_KEY', False)この特定のケースで使用できることはわかっています。私が興味を持っているのは、モジュール内(関数外)の try-except ブロックが期待どおりに動作することを実際にテストすることです。

package.module.CONSTANT期待値に設定されていることを確認する単体テストを作成するにはどうすればよいですか?

unittest ファイル (私は pytest を使用) には、次のようなものがあります。

from package.module import CONSTANT

def test_constant_true():
  assert CONSTANT == 'expected_value'

try ブロックが正しく実行された場合、CONSTANT が期待どおりであることをテストします。

ただし、try ブロックの os.environ で例外が発生し、CONSTANT が False に設定されていることをテストできるように、インポート機構をモックする方法はわかりません。

どうやってやるの?

4

2 に答える 2

2

を使用monkeypatchして環境変数を設定できますが、変更を有効にするにはモジュールをリロードする必要があります。

from importlib import reload

from package import module


def test_constant_true(monkeypatch):
    monkeypatch.setenv('MY_KEY', '42')
    reload(module)
    assert module.CONSTANT == '42'


def test_constant_false():
    reload(module)
    assert not module.CONSTANT

のこの内容を考えるとpackage/module.py:

import os

try:
    CONSTANT = os.environ['MY_KEY']
except KeyError:
    CONSTANT = False
于 2020-04-15T11:40:38.147 に答える