繁体   English   中英

设置函数的return_value

[英]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.AccountAccount类相对于AccountBusiness类的位置。

因此,通过该修补程序,调用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 另外,查看自己的逻辑,为返回Falseaccount_number_is_valid实际上将返回False在你的save方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM