2017-07-19 5 views
4

関数が失敗したときにos._exit(2)を実行することをテストしたいと思います。私は多くのソリューションをsys.exit()と見てきました。SystemExitを使用しています。私はPython3Python2ドキュメントを読んでいると、os._exit()はいえSystemExit`os._exit()`を使用する関数をテストすることは可能ですか?

を使用していないようです、私はそれがだ、それは私の側の文書の誤解だったが、それだけでnosetest終了した場合にthisを試してみましたいなくても、テストの失敗:

make: *** [test] Error 2 

これはおそらくであるため、関数にos._exit(2)

+2

として最後の手段は、単に 'os._exit'メソッドをオーバーライド:https://repl.it/J82h/0 – bakatrouble

+2

あなただけ機能することをテストしたいです* * 'os._exit(2)'を呼び出すか、実際の終了をテストしますか?前者の場合、bakatroubleが示唆している行に沿って関数を模擬することができます。しかし、後者の場合は、おそらくその関数を呼び出す別のプログラムを作成し、そのプログラムを 'os.system'などで呼び出してテストして、そのコードで終了することを確認する必要があります。 – BrenBarn

+0

私がテストしたい関数はカスタムエラー関数です。一度呼び出されると、エラーメッセージを記録し、 'os._exit(2)'を呼び出します。私はロギング部分と終了部分の両方をテストしたいと思います。私はこのモジュールをテストすることしか想定されていないので、コードに実際に触れることはできません。 – Hawker65

答えて

2

os.system()を呼び出し、戻り値は、上位8ビットで終了コードが含まれています、あなたは外部スクリプトの終了コードをこのようにチェックすることができ:

import os 

assert os.system('python script.py') >> 8 == 2 

あなたはまた、sys.exit()os._exit()を模擬できます

import os, sys 
import script 

os._exit = sys.exit 
script.tested_method() # raises SystemExit 
+0

モックは[ソリューション](https://stackoverflow.com/questions/15672151/is-it-possible-for-a-unit-test-to-assert-that-a-method)で非常にうまくいくようです-calls-sys-exit)私は試しました。これは私が知らなかったテストのためのきちんとした小さなトリックです。ご協力ありがとうございました! – Hawker65

+1

Mockingは仕事をしますが、元の動作を正確に複製するわけではありません。 'os._exit()'は既にインタプリタテストツールでテストされていると仮定しているかもしれません。 – bakatrouble

1

unittest.mock.MagicMockオブジェクトは、単に機能をせずに呼び出されたかどうかを確認することが容易になりますそれらがデフォルト動作を実行する必要があります。あなたがよりよい解決策を見つけることができません場合

from unittest import mock 
import os 

def funcToTest(): 
    os.exit(2) 

def test_func(): 
    os._exit = mock.MagicMock() 
    funcToTest() 
    assert os._exit.called 
関連する問題