我有一个班级:
class AccountBusiness:
def save(self, account) -> Account:
if not account.account_number_is_valid():
return False
return True
和测试为:
@mock.patch.object(AccountBusiness, 'save')
def test_can_save_valid_account(self, mock_save):
mock_account = mock.create_autospec(Account)
mock_account.account_number_is_valid.return_value = False
account_business = AccountBusiness()
result = account_business.save(mock_account)
self.assertEqual(result.return_value, True)
但它显示了一个例外:
AssertionError: <MagicMock name='save()()' id='48830448'> != True
我想将account.account_number_is_valid()
的返回值设置为False
并运行测试。
答案 0 :(得分:2)
您正在要测试的实例方法上使用补丁对象。但是,您希望测试save
方法中的逻辑。所以嘲笑它不会测试该方法中的任何逻辑。那么,你实际上得到的输出是:
AssertionError: <MagicMock name='save()()' id='48830448'> != True
应该是第一个暗示某事不对的提示。您的save
方法将以MagicMock
的形式返回。你不想要这个。你真正想要做的只是模仿Account
类,并从那里开始。所以,你在这里打补丁:
@mock.patch.object(AccountBusiness, 'save')
实际上应该只是:
@mock.patch('path.to.AccountBusiness.Account', return_value=Mock(), autospec=True)
path.to.AccountBusiness.Account
是Account
类相对于AccountBusiness
类的位置。
因此,通过该修补,调用return_value
的{{1}}现在将成为您可以用于Account
的模拟对象。所以,代码实际上看起来像这样:
account_number_is_valid
另外,请密切关注最后的断言。它已更改为使用可用的class MyTest(unittest.TestCase):
def setUp(self):
self.account_business = AccountBusiness()
@mock.patch('path.to.AccountBusiness.Account', return_value=Mock(), autospec=True)
def test_can_save_valid_account(self, mock_account):
mock_account_obj = mock_account.return_value
mock_account_obj.account_number_is_valid.return_value = False
self.assertFalse(self.account_business.save(mock_account_obj))
。另外,查看您自己的逻辑,因为assertFalse
的返回False
实际上会在account_number_is_valid
方法中返回False
。