0

我正在从鼻子切换到pytest并且在使用fudge创建模拟/伪造品时遇到问题,因为@fudge.patch将它们传递给测试函数但 pytest 将测试函数参数解释为固定装置。

我想知道 pytest 和 fudge 是否从根本上不兼容,或者我是否缺少一个技巧。我更喜欢 fudge而不是mock,因为它允许您在测试之前更直观地设置期望,而 mock 通过在测试之前定义返回值和之后定义预期调用来拆分事物。

用鼻子我可以用这样的猴子补丁fudge.Fake

from datetime import datetime
from fudge import patch

def today():
    return datetime.utcnow()

def something():
    return today()

test_time = datetime(2018, 1, 1, 12, 34, 56)

@patch('today')
def test_something(fake_today):
    fake_today.expects_call().returns(test_time)
    result = something()
    assert result == test_time

请注意 fudge 如何让您在一个地方设置预期调用和虚假返回,我发现这比 mock 更直观。

但是,使用 pytest 会引发异常,因为 pytest 将测试函数的参数解释为夹具,并且不知道名为 fake_today 的夹具:

test setup failed
file example.py, line 13
  @patch('today')
  def test_something(fake_today):
E       fixture 'fake_today' not found
>       available fixtures: cache, capfd, capfdbinary, caplog, capsys, capsysbinary, doctest_namespace, monkeypatch, pytestconfig, record_xml_attribute, record_xml_property, recwarn, tmpdir, tmpdir_factory
>       use 'pytest --fixtures [testpath]' for help on them.

我可以将 a 声明fake_today为夹具,但我认为 pytest 不会检查期望值,如果确实如此,那么无论在何处使用夹具,它都会始终具有相同的期望值,这并不总是有意义的。

我可以monkeypatch在测试函数中使用fixture 来注入Fakes,但这不如使用装饰器那么简洁。

我还可以定义返回Fake这样的固定装置:

@pytest.fixture
def request(monkeypatch):
    """
    Fake Session.request method so tests can mock expected REST requests.
    """
    fake_request = fudge.Fake()
    monkeypatch.setattr('requests.sessions.Session.request', fake_request)
    yield fake_request
    fudge.verify()

但是你必须为每一个Fake你想注射的人都这样做,这看起来很笨拙。

不知道什么是最好的方法。

4

1 回答 1

0

根据这个问题评论fudge 不打算与 pytest 兼容。

于 2018-03-25T22:11:54.977 回答