在Python中模拟全局变量

4

我在主模块中有一个函数,它接收两个值并对它们执行操作。这个函数使用了一个全局变量,在调用这个函数之前已经创建好了。

def calc(keys,values):
    if globalvar == "calc":
        return sum(keys)
    else:
        return sum(values)

现在进行单元测试

class Testcalc(TestCase):
@mock.patch('module.globalvar ', "calc")
def test_unit(self,calc):
    keys=[1,2,3]
    values=[4,5,6]
    sum=module.calc(keys,values)
    """
    check asserts
    """

我遇到了一个类型错误,因为参数无效。

TypeError('test_unit() takes exactly 2 arguments (1 given)',)

有人能向我展示正确的模拟全局变量的方法吗?

更新: 这对我有效,不确定原因。

class Testcalc(TestCase):
@mock.patch('module.globalvar')
def test_unit(self,var):
    keys=[1,2,3]
    values=[4,5,6]
    var="calc"
    sum=module.calc(keys,values)
    """
    check asserts
    """

谢谢大家


显示完整的错误。 - Daniel Roseman
TypeError('test_unit() takes exactly 2 arguments (1 given)',) - Ram
请在代码中包含调用 test_unit() 函数的语句,即使用它的地方。 - GetHacked
我认为你的错误与你模拟全局的方式无关。但是没有一个最小可重现示例,很难确定。你在这里发布的代码有一个IndentationError,并且稍微变化相同的缩进问题可能会导致类似于你看到的错误,但我怀疑那不是你的问题。所以展示能够真正复现你问题的代码而不是一个不同的问题。 - abarnert
1个回答

7

module.globalvar = 'anything'就足够了,不需要使用mock.patch

def test_calc2(self):
    keys = [1, 2, 3]
    values = [4, 5, 6]

    module.globalvar = "calc"
    sum = module.calc(keys, values)
    self.assertEqual(module.globalvar, 'calc')
    self.assertEqual(sum, 6)

    module.globalvar = 'other'
    sum = module.calc(keys, values)
    self.assertEqual(sum, 15)

这可以使用 PropertyMock 实现。
@mock.patch('module.globalvar', new_callable=mock.PropertyMock)
def test_calc3(self, mocked_globalvar):

这是正确的语法,但测试将失败,因为必须通过PropertyMock设置globalvar

@mock.patch('module.globalvar')
def test_unit(self, mock_globalvar):

1
谢谢您回复,@Gang, 那么我可以在test_unit函数中使用module.globalvar = 'anything'作为参数,而不是使用patch吗?def test_unit(self,var): keys=[1,2,3] values=[4,5,6] module.globalvar = 'calc' sum=module.calc(keys,values) """ check - Ram
@Ram,抱歉module.globalvar是正确的,我已经在更新中包含了它。@mock.patch部分是错误的,它只适用于全局变量、类属性等使用mock.PropertyMock - Gang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接