5

pytest フィクスチャを使用して呼び出しをモックしopen()、テスト ティアダウンでリセットしようとしていますが、何らかの理由でモックがテスト関数に適用されません。

これが私が持っているもののサンプルです:

# tests.py
@pytest.fixture(scope='module')
def mock_open(request):
    mock = flexmock(sys.modules['__builtin__'])
    mock.should_call('open')
    m = (mock.should_receive('open')
        .with_args('/tmp/somefile')
        .and_return(read=lambda: 'file contents'))
    request.addfinalizer(lambda: m.reset())

def test_something(mock_open):
    ret = function_to_test()
    ret[1]()  # This actually uses the original open()

そして、それが重要な場合は、次のfunction_to_test()ようになります。

# some_module.py
def function_to_test():
    def inner_func():
        open('/tmp/somefile').read()   # <-- I want this call mocked
        # More code ...
    return (True, inner_func)

これは、xUnit スタイルのsetup_module()/teardown_module()関数を使用した場合にも発生します。しかし、モック コードをテスト関数自体の中に入れれば (これは明らかにしたくありません)、問題なく動作します。

私は何が欠けていますか?ありがとう!

4

1 に答える 1

14

を使用してはmockどうですか?


tests.py:

import mock # import unittest.mock (Python 3.3+)
import pytest

from some_module import function_to_test

@pytest.fixture(scope='function')
def mock_open(request):
    m = mock.patch('__builtin__.open', mock.mock_open(read_data='file content'))
    m.start()
    request.addfinalizer(m.stop)

def test_something(mock_open):
    ret = function_to_test()
    assert ret[1]() == 'file content'

some_module.py:

def function_to_test():
    def inner_func():
        return open('/tmp/somefile').read()
    return True, inner_func
于 2013-10-31T04:56:37.043 に答える