【问题标题】:Setting mocked method return value when called with specific parameters使用特定参数调用时设置模拟方法返回值
【发布时间】:2014-08-25 14:27:59
【问题描述】:

我有一个通过模拟 Web 服务来工作的测试。我有它,它在调用特定方法时返回特定的返回值。我正在验证包装函数是否返回我期望的值。问题是测试似乎几乎没用。

这是我所拥有的 -

@patch('run.Client')
def test(self, mock_client):
    service = WebService()
    mock_client.return_value.service.GetMemberStatus.return_value = 'E'
    member_status = service.get_member_status(11)
    self.assertEqual('E', member_status)

我要做的只是在使用特定参数调用 GetMemberStatus 方法时返回 E。我已经尝试过 -

mock_client.return_value.service.GetMemberStatus(11, '', '').return_value = 'E'

然而这似乎并没有改变任何东西。

问题 - 我如何才能设置模拟方法的返回值,只有在使用适当的参数调用时?

【问题讨论】:

    标签: python unit-testing python-3.x mocking


    【解决方案1】:

    一般来说,你不会。相反,您断言已使用预期参数调用了您的模拟方法作为测试的一部分:

    gms_mock = mock_client.return_value.service.GetMemberStatus
    gms_mock.return_value = 'E'
    
    member_status = service.get_member_status(11)
    
    self.assertEqual('E', member_status)
    gms_mock.assert_called_with(11, '', '')
    

    您所做的只是记录一个模拟调用,就好像被测代码调用了GetMemberStatus,然后在该调用返回的Mock 实例的return_value 属性上分配了'E'

    可以side_effect attribute 设置为一个函数;它会被传递参数,你可以在那里测试:

    def gms_mock_call(*args):
        assert args == (11, '', '')
        return 'E'
    
    mock_client.return_value.service.GetMemberStatus.side_effect = gms_mock_call
    

    但这确实会测试在错误的位置传递了哪些参数。

    【讨论】:

    • 感谢您的回答以及替代方法。我倾注了嘲笑文件,但没有寻找合适的条款。此外,我发现您可以将 gms_mock_call 方法替换为 lambda - gms_mock.side_effect = lambda *args: 'E' if args == (11, '', '') else None。不过,我不确定我对此有何感想。将不得不玩它。
    • 如果你分配一个 lambda 表达式,结果pep8 会抛出错误E731。再次感谢。
    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2017-09-12
    • 2019-01-06
    相关资源
    最近更新 更多