设置 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.AccountAccount class 相对于 AccountBusiness class.

的位置

因此,通过该补丁,调用 Accountreturn_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 方法中。