Python модульный тест - NameError: имя '' не определено - PullRequest
0 голосов
/ 25 января 2020

Использование Python 3.x. При выполнении теста для следующего кода я получаю ошибку - NameError: name 'TEST_VAR' is not defined. Я прилагаю файл для тестирования, файл yaml, который читает код, и файл модульного теста.

FileToTest.py: https://pastebin.com/d9QQiVSD

from os import path
from typing import TextIO
from yaml import load as yload, SafeLoader

TEST_FILE = "test.yaml"


def retreiveFilePath(fpath, fname, write_mode=False) -> TextIO:
    filePath = open("%(path)s/%(filename)s" % {
        "path": fpath,
        "filename": fname
    },
        "w" if write_mode else "r"
    )
    return filePath


def methodToTest(val1, val2) -> str:
    return "%(base)s/%(name)s/%(version)s.jar" % {
        "base": TEST_VAR["var1"]["var12"],
        "name": val1,
        "version": val2
    }


def method1() -> TextIO:
    try:
        filePath = retreiveFilePath(path.dirname(__file__), TEST_FILE)
        configReturn = yload(filePath.read())
        return configReturn
    except Exception as e:
        print("Failure, ", e)
    return None


if __name__ == '__main__':
    try:
        TEST_VAR = method1()
    except Exception as err:
        exit_code = 1
    exit(exit_code)

yaml Файл:

var1:
  var12: someVal12
  var13: someVal13
var2:
  var21: someVal21

контрольный пример: https://pastebin.com/crLymTHb

import unittest

from mock import patch

import FileToTest

class TestFile(unittest.TestCase):

    def test__get_artifact_url(self):
        val1 = "FName"
        val2 = "LName"
        resp = "someVal12/FName/LName.jar"
        target_resp = FileToTest.methodToTest(val1, val2)
        self.assertEqual(resp, target_resp)


if __name__ == '__main__':
    unittest.main()

Как правильно решить эту ситуацию? Я пытался использовать патч, но не зря.

1 Ответ

0 голосов
/ 26 января 2020

В python есть два уровня переменных: локальный и глобальный. Когда вы ссылаетесь на переменную в функции, она существует только в этой функции, если вы не сделаете ее глобальной переменной. Вы можете передавать переменную как параметр в функции или ссылаться на глобальный. Для этого вы можете переместить TEST_VAR за пределы основной функции или написать выше:

global TEST_VAR
...