如何从单元测试测试文件范围内的变量

我有一个这样的程序


class A():

    def __init__(self):

        self.foo = x


if __name__ == '__main__':

    x = 96

    a=A()

    print(a.foo)

当它从 shell “python foo.py” 运行时,它会打印出 96


我也有 test_foo.py


import foo


import unittest


class TestFoo(unittest.TestCase):

    def test1(self):

        x=37

        a=foo.A()

        self.assertEqual(a.foo, 37)



if __name__ == '__main__':

    unittest.main()

当我从 shell 运行这个 test_foo.py 时,我得到


$ python test_foo.py 

E

======================================================================

ERROR: test1 (__main__.TestFoo)

----------------------------------------------------------------------

Traceback (most recent call last):

  File "test_foo.py", line 8, in test1

    a=foo.A()

  File "/home/zzz/foo.py", line 3, in __init__

    self.foo = x

NameError: global name 'x' is not defined


----------------------------------------------------------------------

Ran 1 test in 0.000s


FAILED (errors=1)

所以我的问题是,是否可以从 test_foo.py 测试 foo.py,设置 x 并看到它在类 A 中使用。 f 而不改变 foo.py 程序


显然,这是一个真实程序的简化版本


我用 python 3.6 和 2.7 得到相同的结果


我曾尝试使用 的各种组合,global但没有找到使用它的方法


慕容森
浏览 147回答 3
3回答

湖上湖

您可以x在此处访问全局范围内的变量:        self.foo = x当您直接运行脚本时__name__是' main ',而不是设置全局变量x而不是construct A()。当您导入foo模块代码时,if不执行。x全局作用域和任何外部作用域中都没有变量。

四季花海

您的x变量是在if检查是否foo.py作为主程序运行的块内定义的,因此何时foo.py由test_foo.py,导入,x将不会被定义,因此会出现错误。您应该x在if块外定义:x = 96class A():    def __init__(self):        self.foo = xif __name__ == '__main__':    a=A()    print(a.foo)而在test_foo.py,如果你想覆盖的价值x的foo,你应该做foo.x=37的,而不是x=37因为x否则将是一个局部变量test1。

慕的地10843

您需要将其更改为:class A():    def __init__(self,x):        self.foo = x并在测试中:class TestFoo(unittest.TestCase):    def test1(self):        x=37        a=foo.A(x)        self.assertEqual(a.foo, 37)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python