pytest-mock:模拟一个抽象类

时间:2018-02-10 11:10:49

标签: python python-3.x pytest

我正在尝试使以下代码工作:

from pytest_mock import mocker

class TestClass(mocker):
  def setup_method(self):
    self.some_mock = SomeAbstractClass()
    self.testsubject = ClassThatIsBeingTested(self.some_mock)

  def test_1(self):
    mocker.patch(self.some_mock, 'some_function', return_value=5)
    assert 5 == self.testsubject.function_that_internally_uses_the_mock()

但我试图实例化一个抽象类得到TypeError

我如何模仿SomeAbstractClass

2 个答案:

答案 0 :(得分:2)

您可以使用unittest.mock模块(也作为Python 2.7的mock包提供)来创建模拟实例,而不是尝试修补实际实例:

import sys

if sys.version_info[0] == 2:
    from mock import Mock
else:
    from unittest.mock import Mock

# ...

some_mock = Mock(spec=SomeAbstractClass)
some_mock.some_function.return_value = 5

some_mock.some_function()
# => 5

some_mock.non_existent_function()
# => AttributeError: Mock object has no attribute 'non_existent_function'

这适用于创建任何类的模拟实例 - 而不仅仅是抽象类。

答案 1 :(得分:1)

使用def f(x): return (x ** 2).sum() df = df.resample('5S').agg({'a':f, 'b':'all'}) print (df) a b timestamp 2020-09-04 00:00:00 5 False 2020-09-04 00:00:05 25 True 2020-09-04 00:00:10 25 True pytest-mock可以使用mocker.patch.multiple方法覆盖unittest.mock属性。这样,您将能够创建抽象类的实例并测试其抽象方法。

使用pytest和pytest-mock的示例:

__abstractmethods__