Python2.6 unittest-如何设置函数中全局变量的值,您';重新测试

Python2.6 unittest-如何设置函数中全局变量的值,您';重新测试,python,python-unittest,Python,Python Unittest,我在为单元测试编写的函数中设置全局变量的值时遇到问题 该函数可能尚未准备好用于测试。或者至少是用来以一种简单的方式进行测试,但我正在努力解决这个问题 下面是我尝试测试的函数的一个示例: def my_func_with_globals(filepath): spos=filepath.find(__my_global_var1) new_path = filepath[0:spos] + __my_global_var2 return new_path def some_funct

我在为单元测试编写的函数中设置全局变量的值时遇到问题

该函数可能尚未准备好用于测试。或者至少是用来以一种简单的方式进行测试,但我正在努力解决这个问题

下面是我尝试测试的函数的一个示例:

def my_func_with_globals(filepath):
  spos=filepath.find(__my_global_var1)
  new_path = filepath[0:spos] + __my_global_var2
  return new_path

def some_function():
  ...
  my_func_with_globals(filepath)
  ...

if __name__ = '__main__':
  global __my_global_var1
  __my_global_var1='value1'  
  global __my_global_var2
  __my_global_var2='value2'
  ...
  some_function()
下面是我测试的一个例子:

import unittest
from my_module import *

class UnitTestMyModule(unittest.TestCase):
  def test_my_func_with_globals(self):
    self.assertEqual(my_func_with_globals('arbitrary/file/path'), 'valid output')
另一个使用@kdopen建议的测试示例(给出了相同的错误):

我不断得到错误:

NameError:未定义全局名称“\uuuu my\u global\u var1”


我试过几种不同的方法,但都没用。使用unittest.mock.patch看起来会很好地工作,但我仍然坚持使用v2.6.4当前的版本

全局变量是用双前导下划线定义的,因此它们不是由my_module import*语句中的
导入的

您可以通过以下方式访问它们:

from my_module import __my_global_var1, __my_global_var2
或者,如果您使用了
导入我的\u模块
,您可以通过
我的\u模块.\uu我的\u全局\u变量1
等方式访问它们

但是我在您的示例测试用例中没有看到任何对全局变量的引用

这里有一个简单的例子

a、 派克

b、 py:

并运行
b.py

$ python2.6 b.py 
global1: 1
foo: 1
foo: 2
更新:

该死,错过了明显的机会

if
测试中声明变量。该代码不会在
import
上运行-仅当您从命令行执行
python my_模块时才会运行

在导入过程中,
\uuuuuu name\uuuuuuuuuu
将被设置为
myu模块
,而不是
\uuuuuuu主模块


因此,是的-当您调用单元测试时,它们是未定义的。

我实际上已经尝试过“导入我的\u模块”,然后使用我的\u模块设置要在测试中使用的值。\uuuu我的\u全局\u var1和我的\u模块。\uu我的\u全局\u var2,我仍然得到相同的错误“NameError:global name”\uuuuuMy\uglobal\uVar1“没有定义”,然后似乎还有其他事情发生。。。globals实际上是在
myu模块中定义的,还是它导入了其他内容(或者可能在
\uu init\uuuuuuuuuuuuuupy.py
中)添加了工作代码,使用python v2.6显式运行。。。虽然它是v2.6.9,我刚刚添加了代码的真正问题;)哈哈,接得好!我完全没有意识到导入时,
\uuuu name\uuuuuuuu
将被设置为
myu模块
,而不是
\uuuu主模块
。我在if测试中将全局变量设置为
my\u模块。\uuu我的\u全局变量1
,世界又变对了。伟大的解释顺便说一句!
__global1 = 1

def foo():
    return __global1
import a

print "global1: %d" % a.__global1
print "foo: %d" % a.foo()
a.__global1 = 2
print "foo: %d" % a.foo()
$ python2.6 b.py 
global1: 1
foo: 1
foo: 2