设置 return_value 的功能
set return_value of function
我有一个 class:
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()
的 return 值设置为 False
和 运行 测试。
您正在对要测试的实例方法使用补丁对象。但是,您希望测试 save
方法中的逻辑。所以模拟它不会测试该方法中的任何逻辑。所以,你实际得到的输出是:
AssertionError: <MagicMock name='save()()' id='48830448'> != True
应该是不对劲的第一个提示。您的 save
方法将作为 MagicMock
回归。你不想要这个。你真正想做的只是模拟 Account
class,然后从那里开始。所以,你在这里打补丁:
@mock.patch.object(AccountBusiness, 'save')
实际上应该只是:
@mock.patch('path.to.AccountBusiness.Account', return_value=Mock(), autospec=True)
path.to.AccountBusiness.Account
是 Account
class 相对于 AccountBusiness
class.
的位置
因此,通过该补丁,调用 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
。另外,请检查您自己的逻辑,因为 returning False
for account_number_is_valid
实际上会 return False
在您的 save
方法中。
我有一个 class:
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()
的 return 值设置为 False
和 运行 测试。
您正在对要测试的实例方法使用补丁对象。但是,您希望测试 save
方法中的逻辑。所以模拟它不会测试该方法中的任何逻辑。所以,你实际得到的输出是:
AssertionError: <MagicMock name='save()()' id='48830448'> != True
应该是不对劲的第一个提示。您的 save
方法将作为 MagicMock
回归。你不想要这个。你真正想做的只是模拟 Account
class,然后从那里开始。所以,你在这里打补丁:
@mock.patch.object(AccountBusiness, 'save')
实际上应该只是:
@mock.patch('path.to.AccountBusiness.Account', return_value=Mock(), autospec=True)
path.to.AccountBusiness.Account
是 Account
class 相对于 AccountBusiness
class.
因此,通过该补丁,调用 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
。另外,请检查您自己的逻辑,因为 returning False
for account_number_is_valid
实际上会 return False
在您的 save
方法中。