我正在从鼻子切换到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 来注入Fake
s,但这不如使用装饰器那么简洁。
我还可以定义返回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
你想注射的人都这样做,这看起来很笨拙。
不知道什么是最好的方法。