Ошибка: «Элемент последовательности обновления словаря # 0 имеет длину 1; требуется 2» в модульном тесте - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть два файла: database_config.py, используемый для проверки соединения с базой данных через файл конфигурации DatabaseConfig.yml. Мне нужно написать несколько тестов для моего конфигурационного файла, включающего в себя несколько сценариев ios:

  1. Если база данных пуста, тестовый сценарий не пройден.
  2. Если база данных не Sqlite или Postgre, тестовый пример не пройден.

Я создал тестовый файл, но при попытке его реализовать у меня появляется ошибка

ValueError: dictionary update sequence element #0 has length 1; 2 is required.

Может ли кто-нибудь помочь мне в этом?

My DatabaseConfig.yml:

database: 

dbopt:
   host: None
   port: 6313
   dbname: spam_eggs2

query:
   select * from manufacturing_product

My database_config.py:

import yaml

class InvalidConfigError(Exception):
    pass

class DB():
    def __init__(self, dbconf):
        self._dbconf = dict(dbconf)
        # checking for database type
        dbtype = self.get_db_type()
        if dbtype != 'sqlite' and dbtype != 'postgres':
            raise InvalidConfigError(
                'E01001', 'Invalid database type, should be sqlite or postgres.')
        else:
            self.dbtype = dbtype

    def get_db_type(self):
        return self._dbconf['database']

with open('DatabaseConfig.yml') as f:
    data = yaml.full_load(f)

    for item, doc in data.items():
        print(item, ":", doc)

    database = DB(data)

Мой тестовый файл test_db_type.py для database_config.py:

import yaml
import unittest
import database_config

class TestDBtype(unittest.TestCase):
    #setUpClass gets calls only once where as setUp gets called before every test
    @classmethod
    def setUpClass(cls):
        cls.init_db()

    @classmethod
    def init_db(cls):
        self.db_instance = database_config.DB('DatabaseConfig.yml')

    def test_missing_db(self):
        self.assertEqual(self.db_instance, None, "Connection returned None.")

    def test_db_type(self):
        with self.subTest():
            self.assertEqual(self.db_instance, 'postgres')
        with self.subTest():
            self.assertEqual(self.db_instance, 'sqlite')

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

Ошибка трассировки при запуске теста:

(base) D:\Python>python -u "d:\Python\TestDataSource\test_db_type.py"
database : postgres
dbopt : {'host': 'None', 'port': 6313, 'dbname': 'spam_eggs2'}
query : select * from manufacturing_product
E
======================================================================
ERROR: setUpClass (__main__.TestDBtype)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "d:\Python\TestDataSource\test_db_type.py", line 9, in setUpClass
    cls.init_db()
  File "d:\Python\TestDataSource\test_db_type.py", line 13, in init_db
    self.db_instance = database_config.DB('DatabaseConfig.yml')
  File "d:\Python\TestDataSource\database_config.py", line 8, in __init__
    self._dbconf = dict(dbconf)
ValueError: dictionary update sequence element #0 has length 1; 2 is required

----------------------------------------------------------------------
Ran 0 tests in 0.001s

FAILED (errors=1)

(base) D:\Python>C:/Users/duongnb/AppData/Local/Continuum/anaconda3/Scripts/activate

(base) D:\Python>conda activate base

(base) D:\Python>^A


1 Ответ

1 голос
/ 14 февраля 2020

Здесь:

self.db_instance = database_config.DB('DatabaseConfig.yml')

вы передаете один строковый аргумент конструктору DB; этот аргумент передается здесь:

class DB():
    def __init__(self, dbconf):
        self._dbconf = dict(dbconf)

, но вы не можете создать дикт из одного аргумента - dict('DatabaseConfig.yml') вызывает ошибку.

...