设置函数的return_value

时间:2016-04-17 11:52:37

标签: 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_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并运行测试。

1 个答案:

答案 0 :(得分:2)

您正在要测试的实例方法上使用补丁对象。但是,您希望测试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类的位置。

因此,通过该修补,调用return_value的{​​{1}}现在将成为您可以用于Account的模拟对象。所以,代码实际上看起来像这样:

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