在单元测试“设置”中部分模拟方法



我正在尝试理解模拟/补丁框架,但遇到了问题。以下是我的简化代码:

file_a.py
class A:
  def f(self): 
    b = B()
    b.g()
    b.h()
file_b.py
class B:
  def g(self):
    return network_requests(...)
  def h(self):
    return "This is should not be mocked."
file_test.py
class SomeTests:
  def setUp(self):
    with patch('file_b.B', autospec=True) as mock:
      mock.g.return_value = "Mocked value"
      mock.side_effect = lambda : B()
    self.a = A()
  def test(self):
    self.a.f()

本质上,我只想在测试中模拟B.g,而不是B.h.我从 https://docs.python.org/3/library/unittest.mock-examples.html#partial-mocking 那里得到了一些想法,但B.g仍然没有被嘲笑。

谢谢!

在您链接的示例中,关键问题是

不幸的是datetime.date是用 C 语言编写

这就是为什么你需要模拟模块并包装你不想模拟的内容(你不能直接修补 C 方法)。

所有其他情况(补丁 python 对象)您都可以只使用:

with patch('file_b.B.g', autospec=True) as mock_g:
  mock_g.return_value = "Mocked value"

无论如何,请注意您的补丁将仅在with上下文中处于活动状态,您将在其中找到原始参考。为了更好地控制上下文,您还可以使用 装饰器, start()stop() .

我强烈建议您仔细阅读patch和在哪里打补丁。

相关内容

  • 没有找到相关文章

最新更新