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,它将再次返回所提到的异常