2017-05-16 21 views
2

私はpytestとasynctestを使用して、F2とモックF1をテストしようとモジュール名/ app.pypythonを使って別の関数内のコルーチン関数をPythonモックにパッチしますか?

async def f1(arg): 
    # do something 
    return arg + '1' 


async def f2(arg): 
    result = await f1(arg) 
    return result 

に二つの機能を持っています。
私は

に合格

def sf_f1(arg): 
    return 'some value' 

@pytest.mark.asyncio 
async def test_f2(): 
    with asynctest.mock.patch('module_name.app.f1', side_effect=sf_f1): 
     assert 'some value' == await f2('test') 

テストを行う。しかし、私はなぜdoesnの私は

assert 'some value' == await f2('test') 
    AssertionError: assert 'some value' == 'test1' 
    - some value 
    + test1 

を取得し、この

import module_name 

@pytest.fixture() 
def mock_f1(): 
    return asynctest.CoroutineMock(module_name.app.f1, side_effect=sf_f1) 


@pytest.mark.asyncio 
async def test_f2_2(mock_f1): 
    assert 'some value' == await f2('test') 

ような何かを行うしたい場合にのみ、動作します第二の道はうまくいきますか?

+2

何が問題なのですか?あなたの望む結果は何ですか?実際の結果は何ですか? –

+1

モックが機能せず、関数f1が実行されます。私は戻り値またはside_effectを模擬関数に追加したい。 – Oksana

+0

side_effect関数を追加しました。 最初のケースでは、動作します。 2番目のケースでは、関数f2が実行され、side_effect関数は実行されません。 – Oksana

答えて

1

mock_f1フィクスチャでは、CoroutineMockオブジェクトを作成して返します。しかし、あなたはmodule_name.app.f1関数を上書きしません:Mockのようなオブジェクトは何も自動的にパッチしません。ここで

はあなたの例に示す追加です:

@pytest.mark.asyncio 
async def test_f2_2(mock_f1): 
    print('fixture value:', mock_f1) 
    print('actual module_name.app.f1 function:', module_name.app.f1) 
    assert 'some value' == await f2('test') 

あなたがf2を呼び出すと、それが上書きされていないモジュールからf1機能を使用しています。この

fixture value: <CoroutineMock spec='function' id='139756096130688'> 
actual module_name.app.f1 function: <function f1 at 0x7f1b7e1139d8> 

ようsomethink印刷されますどの。だからここ

が、これはあなたのために働くだろうかです:

@pytest.fixture 
def mock_f1(monkeypatch): 
    fake_f1 = asynctest.CoroutineMock(module_name.app.f1, side_effect=sf_f1) 
    monkeypatch.setattr(module_name.app, 'f1', fake_f1) 
    return fake_f1 

あなたはおそらく知っているように、monkeypatchは、フィクスチャがアクティブな間だけ、変更が適用されることを確認します。

+0

ありがとうございます!今それは動作します! 私は最近pytestとmockを使い始めたので、あなたは本当に私をたくさん助けました! – Oksana

関連する問題