Python 设置函数的返回值
我有一门课:Python 设置函数的返回值,python,unit-testing,mocking,Python,Unit Testing,Mocking,我有一门课: 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_acco
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
AssertionError:!=真的
我想将
account.account\u number\u is\u valid()
设置为False
,然后运行测试。您正在寻找测试的实例方法上使用补丁对象。但是,您需要测试save
方法中的逻辑。因此,模仿它不会测试该方法中的任何逻辑。因此,这里实际得到的输出:
AssertionError: <MagicMock name='save()()' id='48830448'> != True
实际上应该是:
@mock.patch('path.to.AccountBusiness.Account', return_value=Mock(), autospec=True)
path.to.AccountBusiness.Account
是Account
类相对于AccountBusiness
类的位置
因此,通过该修补,调用帐户的返回值现在将成为您的模拟对象,您可以将其用于帐户号\u是否有效。因此,代码实际上如下所示:
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
是有效的
实际上会返回False
您正在寻找测试的实例方法上使用面片对象。但是,您需要测试save
方法中的逻辑。因此,模仿它不会测试该方法中的任何逻辑。因此,这里实际得到的输出:
AssertionError: <MagicMock name='save()()' id='48830448'> != True
实际上应该是:
@mock.patch('path.to.AccountBusiness.Account', return_value=Mock(), autospec=True)
path.to.AccountBusiness.Account
是Account
类相对于AccountBusiness
类的位置
因此,通过该修补,调用帐户的返回值现在将成为您的模拟对象,您可以将其用于帐户号\u是否有效。因此,代码实际上如下所示:
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
是有效的
实际上会返回False
如果将account\u number\u设置为False
,save
也将返回False
,断言将失败。你还期待什么?如果希望断言成功,必须将其设置为True
。@Selcuk设置的值无关紧要。如果我将其设置为True,它将再次返回所提到的例外情况。如果您将账号\u有效
设置为假
,保存
也将返回假
,断言将失败。你还期待什么?如果希望断言成功,必须将其设置为True
。@Selcuk设置的值无关紧要。如果我将其设置为True,它将再次返回所提到的异常