2017-02-21 25 views
0

ため、私はこれを行う機能のための出力をキャプチャして分析する:(ERR、中)subprocess.call

subprocess.call(引数、STDIN = sys.stdinを、STDOUT =モックと私はsys.stdinを(および他の人にパッチを適用するとValueError: redirected Stdin is pseudofile, has no fileno()

)私が手:sys.stdoutの、私はpy.testの下で任意のモックせずにこのコードを実行すると標準エラー出力= sys.stderrを持ち)

私はエラーを取得します同じエラー。

私はmock.mock_open()でsys.stdinをパッチを適用すると、私はエラーを取得する:AttributeError: Mock object has no attribute 'write'

私はmock.mock_open()('name', 'r')でsys.stdinをパッチを適用すると、私は、最初のエラーを取得:ValueError: redirected Stdin is pseudofile, has no fileno()

はとモックオブジェクトのいくつかの種類を渡すためにどのような方法ですサブプロセスのstdin/out?

mocked = (put something here) 
subprocess_call('ls', stdin=mocked, stdout=mocked, stderr=mocked) 

py.testの下で実行したときに動作するはずです:

は、私はこのような何かをしたいです。

ありがとうございました。

+0

:私はのFDを作成して、私のテストのsubprocess.call

ここでは簡略化されたバージョンからの標準出力をキャプチャするために、これらを使用するos.pipeコールを使用することを決めましたか?サブプロセスが動作するかどうかはテストされません。*サブプロセスを使用するコードが機能する場合のみです。 –

+0

外部コマンドが正しく動作することをテストするのはあなたの仕事ではないと主張する人もいます。 'subprocess_call'自体をモックする必要があります。 – chepner

+0

このテストは統合テストの一環であり、stdout/errだけを嘲笑してコマンド結果をチェックします(そうしないと、ユーザー端末に直接行くためです)。私のプログラムと外部プログラムの両方が自分たちがやるべきことをするのを見るためには、実際の外部プログラム出力(argsから)が必要です。 –

答えて

0

私はいくつかの苦労の末、subprocess.callのstdoutをパッチしてインターセプトする方法を見つけました。

私の主な問題は、call機能の非モックバージョンには、オペレーティングシステムの実際のFDが必要だということでした。私にそのようなことを提供する模擬はありません。

同時に、実際にテストのセットアップ/ティアダウンが複雑になるため、ファイルの作成を避けたいと思っています。なぜあなたは `subprocess.call`をからかっていない

def test_exec_results(ssh): 
    rfd, wfd = os.pipe() 
    w = os.fdopen(wfd, 'w', 0) 
    with mock.patch.multiple(app.sys, stdout=w, stderr=w, stdin=None): 
     app.myfunction('test message') 
    output = os.read(rfd, 1000) 
    assert 'test message ' in output 
    assert 'some_other_things' in output