在函数中模拟函数
Mocking a function in a function
我正在尝试模拟函数中的几个函数调用,以便测试它们的行为。
我尝试了几种不同的方法,如代码所示,但 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")
所有测试都失败了,return 来自实际函数的值。我哪里错了?
添加了信息。
尝试将路径更改为 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")
第一个不行,第二个改路径后就可以了。第三个和第四个需要从 assert 语句中删除 .test
我正在尝试模拟函数中的几个函数调用,以便测试它们的行为。
我尝试了几种不同的方法,如代码所示,但 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")
所有测试都失败了,return 来自实际函数的值。我哪里错了?
添加了信息。
尝试将路径更改为 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")
第一个不行,第二个改路径后就可以了。第三个和第四个需要从 assert 语句中删除 .test