Python 2.6 unittest - 如何在您正在测试的函数中设置用于全局变量的值

时间:2016-08-11 18:42:45

标签: 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_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目前的功能。

1 个答案:

答案 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__

所以,是的 - 当你打电话给你的单元测试时,他们未定义。