2017-05-24 29 views
2

Pytestを使うときに何らかの理由でmock.patchを動作させることができません。それは単にパッチを当てません。私はそれを間違って使用していますか、何か私の設定がうんざりしていますか?模擬テスト/ pytest-mockを使ったPytest

base.py

def foo(): 
    return 'foo' 

def get_foo(): 
    return foo() 

test_base.py

import pytest 
import mock 
from pytest_mock import mocker 

from base import get_foo 

@mock.patch('base.foo') 
def test_get_foo(mock_foo): 
    mock_foo.return_value = 'bar' 
    assert get_foo() == 'bar' 

def test_get_foo2(mocker): 
    m = mocker.patch('base.foo', return_value='bar') 
    assert get_foo() == 'bar' 

def test_get_foo3(): 
    with mock.patch('base.foo', return_value='bar') as mock_foo: 
     assert get_foo() == 'bar' 

pytest結果

============================================================= test session starts ============================================================= 
platform linux2 -- Python 2.7.13, pytest-3.0.7, py-1.4.33, pluggy-0.4.0 
rootdir: /projects/git/ABC/query, inifile: 
plugins: mock-1.6.0 
collected 13 items 

test_base.py .....FFF..... 

================================================================== FAILURES =================================================================== 
________________________________________________________________ test_get_foo _________________________________________________________________ 

mock_foo = <MagicMock name='foo' id='140418877133648'> 

    @mock.patch('base.foo') 
    def test_get_foo(mock_foo): 
     mock_foo.return_value = 'bar' 
>  assert get_foo() == 'bar' 
E  AssertionError: assert 'foo' == 'bar' 
E   - foo 
E   + bar 

test_base.py:67: AssertionError 
________________________________________________________________ test_get_foo2 ________________________________________________________________ 

mocker = <pytest_mock.MockFixture object at 0x7fb5d14bc210> 

    def test_get_foo2(mocker): 
     m = mocker.patch('base.foo', return_value='bar') 
>  assert get_foo() == 'bar' 
E  AssertionError: assert 'foo' == 'bar' 
E   - foo 
E   + bar 

test_base.py:71: AssertionError 
________________________________________________________________ test_get_foo3 ________________________________________________________________ 

    def test_get_foo3(): 
     with mock.patch('base.foo', return_value='bar') as mock_foo: 
>   assert get_foo() == 'bar' 
E   AssertionError: assert 'foo' == 'bar' 
E    - foo 
E    + bar 

test_base.py:75: AssertionError 

答えて

2

問題は、によるものでした私のインポート仕様とPATH変数の関係。 patch引数にパス全体を指定した場合、たとえば、@mock.patch('<PROJECT_ROOT>.<SUBPACKAGE>.base.foo')のように、PATHにエントリの親ディレクトリがある場合、それは機能しました。 base.fooが見つからない場合、なぜインポートエラーを投げていないのか分かりません。それが見つからなければ、どのようにスコープが違うのか分かりません。

+1

pytest_mockを使ってオブジェクトをモックするさまざまな方法を示してくれてありがとう。 –

関連する問題