我在为单元测试编写的函数中设置全局变量的值时遇到了问题。
该功能可能尚未准备好用于测试。或者至少习惯于以简单的方式进行测试,但我试图解决这个问题。
以下是我尝试测试的功能示例:
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的建议进行测试的另一个例子(给我同样的错误):
import unittest
import my_module
class UnitTestMyModule(unittest.TestCase):
def test_my_func_with_globals(self):
my_module.__my_global_var1='some/value'
my_module.__my_global_var2='second_val'
self.assertEqual(my_module.my_func_with_globals('arbitrary/file/path'), 'valid output')
我一直收到错误:
NameError:全局名称' __ my_global_var1'没有定义。
我尝试了一些不同的东西,但我无法解决任何问题。使用unittest.mock.patch看起来它可以很好地工作,但我仍然坚持使用v2.6.4目前的功能。
答案 0 :(得分:1)
全局变量用双前导下划线定义,因此它们不会被from my_module import *
语句导入。
您可以使用以下内容访问它们:
from my_module import __my_global_var1, __my_global_var2
或者,如果您使用import my_module
,则可以my_module.__my_global_var1
等方式访问它们
但是我没有在样本测试用例中看到对全局变量的任何引用
这是一个简单的例子
a.py
__global1 = 1
def foo():
return __global1
b.py:
import a
print "global1: %d" % a.__global1
print "foo: %d" % a.foo()
a.__global1 = 2
print "foo: %d" % a.foo()
正在运行b.py
$ python2.6 b.py
global1: 1
foo: 1
foo: 2
更新:
该死,错过了明显的您在if
测试中声明变量。只有当您从命令行执行import
时,该代码才会在python my_module
上运行。
在导入过程中,__name__
将设置为my_module
,而不是__main__
所以,是的 - 当你打电话给你的单元测试时,他们是未定义。