我可以使用 side_effect 函数修改 Mock 的参数吗?

问题描述 投票:0回答:1

背景: 我需要用

callproc
变量模拟 Oracle
OUT
。 所以我需要修改给予模拟函数的参数之一。

并且它不会改变给定参数的值。

我认为 Mock 确实会复制参数,因此原始变量值无法更改。 我在文档中找不到有关此问题的任何内容,可能是因为我正在寻找错误的东西。

但是 还有其他办法吗...?

我写了一个非常简单的测试来玩,但失败了:

from unittest.mock import MagicMock


def simple_callproc(bla):
    bla += 1


def test_very_simple_mock_modifies_args():
    m = MagicMock()
    m.callproc.side_effect = simple_callproc
    nix = 1
    m.callproc(nix)
    m.callproc.assert_called()
    m.callproc.assert_called_with(nix)
    assert nix == 2, "Not modified"
python mocking
1个回答
0
投票

问题是整数不可变,意味着如果您无法使用其他方法更新它们,因此不要使用一个整数,而是使用整数列表,就像这样

from unittest.mock import MagicMock


def simple_callproc(bla):
    bla[0] += 1


def test_very_simple_mock_modifies_args():
    m = MagicMock()
    m.callproc.side_effect = simple_callproc
    nix = [1]
    m.callproc(nix)
    m.callproc.assert_called()
    m.callproc.assert_called_with(nix)
    assert nix[0] == 2, "Not modified"

使用 pytest 进行测试 enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.