Как проверить переменную в файле, из модульного теста - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть такая программа

class A():
    def __init__(self):
        self.foo = x

if __name__ == '__main__':
    x = 96
    a=A()
    print(a.foo)

Когда она запускается из оболочки "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()

Когда я запускаю этот 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)

Так что мой вопрос: можно ли проверить foo.py из test_foo.py, чтобы установить x и увидеть его?используется в классе A. f Без изменения программы foo.py

Очевидно, это упрощенная версия реальной программы

Я получаю те же результаты с Python 3.6 и 2.7

Я пытался использовать различные комбинации global, но не нашел способа использовать это

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Ваша переменная x определена в блоке if, который проверяет, выполняется ли foo.py в качестве основной программы, поэтому, когда foo.py импортируется test_foo.py, x не будет определено,отсюда ошибка.

Вы должны определить x вне блока if:

x = 96

class A():
    def __init__(self):
        self.foo = x

if __name__ == '__main__':
    a=A()
    print(a.foo)

И в test_foo.py, если вы хотите переопределить значение x из foo, вы должны сделать foo.x=37 вместо x=37, так как в противном случае x будет локальной переменной для test1.

0 голосов
/ 14 февраля 2019

Здесь вы получаете доступ к переменной x в глобальной области видимости:

        self.foo = x

Когда вы запускаете скрипт напрямую __name__ равен ' main ', чем вы устанавливаете глобальную переменную x и чем построить A().При импорте foo код модуля под if не выполняется.В глобальной области видимости нет ни переменной x, ни внешней области.

0 голосов
/ 14 февраля 2019

Вам нужно изменить его на:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...