我正在尝试在一个函数中模拟几个函数调用,以便我可以测试它们的行为。
我尝试了几种不同的方法,如代码中所示,但是它should_be_mocked函数永远不会被嘲笑。我使用python3,PyCharm,将测试框架设置为pytest
test.py
from unittest import mock, TestCase
from unittest.mock import patch
from path import should_be_mocked
from other_path import flow
def test_flow(monkeypatch):
def ret_val():
return should_be_mocked("hi")
monkeypatch.setattr('path', "should_be_mocked", ret_val())
assert flow() == "hi"
def test_flow2(monkeypatch):
monkeypatch.setattr('path.should_be_mocked', lambda x: "hi")
assert flow() == "hi"
@patch('path.should_be_mocked')
def test_flow3(mocker):
mocker.return_value = "hello returned"
flow()
mocker.test.assert_called_with("hello")
class TestStuff(TestCase):
@patch('path.should_be_mocked')
def test_flow4(self, mocker):
mocker.return_value = "hello returned"
flow()
mocker.test.assert_called_with("hello")
路径
def should_be_mocked(hello):
return hello
other_path
def flow():
# business logic here
return should_be_mocked("hello")
所有测试均失败,并从实函数返回值。我哪里做错了?
添加了信息。
尝试将路径更改为other_path导致
E AttributeError: 'other_path' has no attribute 'should_be_mocked'
最佳答案
我在这里回答我自己的问题。感谢@hoefling,我发现该路径被误用了。但是我无法运行第一个测试用例。其他人在像这样重做之后工作了。
def test_flow2(monkeypatch):
monkeypatch.setattr('other_path', lambda x: "hi")
assert flow() == "hi"
@patch('other_path.should_be_mocked')
def test_flow3(mocker):
flow()
mocker.assert_called_with("hello")
class TestStuff(TestCase):
@patch('other_path.should_be_mocked')
def test_flow4(self, mocker):
flow()
mocker.assert_called_with("hello")
第一个无效,第二个在更改路径后有效。第三和第四需要从断言语句中删除.test