我正在尝试使用@patch
装饰器和模拟对象来测试我的代码使用一些库的行为。不幸的是,我看不到任何方法来做我想要做的事情,只使用装饰器,而且看起来我应该能够做到。我意识到,通常我应该更关注方法的返回值,而不是它对库的特定调用序列,但编写一个测试来将一个图像与另一个图像进行比较是非常困难的。
我想也许我可以创建模拟对象的实例,然后使用@patch.object(...)
,但这不起作用,显然@patch('MockObject.method')
只会模拟类方法。我可以通过使用with patch.object(someMock.return_value, 'method') as mockName
让代码正常工作,但这会使我的测试变得混乱。
from some.module import SomeClass
class MockObject:
def method(self):
pass
class TestClass:
@patch('SomeClass.open', return_value=MockObject())
@patch('??????.method') # I can't find any value to put here that works
def test_as_desired(self, mockMethod, mockOpen):
instance = SomeClass.open()
instance.method()
mockOpen.assert_called_once()
mockMethod.assert_called_once()
@patch('SomeClass.open', return_value=MockObject())
def test_messy(self, mockOpen):
with patch.object(mockOpen.return_value, 'method') as mockMethod:
instance = SomeClass.open()
instance.method()
mockOpen.assert_called_once()
mockMethod.assert_called_once()
发布于 2019-06-12 03:22:08
我认为你把事情搞得太复杂了:
import unittest.mock
@unittest.mock.patch.object(SomeClass, open=mock.Mock())
def test_as_desired(self, mock_open):
instance = SomeClass.open() # SomeClass.open is a mock, so its return value is too
instance.method()
mock_ppen.assert_called_once()
instance.method.assert_called_once()
https://stackoverflow.com/questions/56550060
复制相似问题