[英]How to setup return_value for a function call with specific signature?
[英]set return_value of function
我有一堂课:
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
并运行测试。
您正在要测试的实例方法上使用补丁对象。 但是,您希望测试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
类的位置。
因此,通过该修补程序,调用Account
的return_value
现在将成为您的模拟对象,您可以将其用于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
在你的save
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.