У меня есть простое приложение sqlite, управляемое классом. По сути, я хочу запустить для него модульные тесты, но пока не смог.
class DB:
def __init__(self, dbname='mydb.db'):
try:
self.connection = sqlite3.connect(dbname)
except:
print('Error')
finally:
pass
Любой класс будет использовать его тогда:
class Hello:
def hi(self):
db = DB() # Create db or connect to existing one
cursor = db.connection.cursor()
Теперь при тестировании я передаю тестовую базу данных:
db = DB('test.db')
#create datatabase here and all works fine
h = Hello()
Теперь h использует mydb.db вместо test.db. Как можно протестировать вышеуказанную структуру?






Если вы хотите передать экземпляр своего класса DB (db), вам нужно будет передать экземпляр вашему классу Hello. Пытаться:
class DB:
def __init__(self, dbname='mydb.db'):
try:
self.connection = sqlite3.connect(dbname)
except:
print('Error')
finally:
pass
class Hello:
def hi(self, db=DB()): # we make it have a default db of DB() (which in turn defaults to 'mydb.db')
# db = DB() # Create db or connect to existing one
# ^^ we remove this line because now this is the default
cursor = db.connection.cursor()
db = DB('test.db') # this makes an instance of your DB class and calls it "db"
h = Hello(db) # now we need to feed this instance
Хотя это, вероятно, не лучший способ сделать это. Вы, вероятно, выиграете больше от наличия одного класса с методами, потому что ваш второй класс в основном бесполезен и в любом случае очень тесно связан с вашим первым классом:
class DB:
def __init__(self, dbname='mydb.db'):
try:
self.connection = sqlite3.connect(dbname)
except:
print('Error')
finally:
pass
def hello(self): # making a method instead
cursor = self.connection.cursor()
db = DB('test.db') # this makes an instance of your DB class and calls it "db"
db.hello() # call our method
Изначально я пропустил кое-что, что обнаружил при тестировании своего кода. Ваш код должен работать нормально, но вам нужно вызвать метод, который вы создали! Попробуй это:
import sqlite3
class DB:
def __init__(self, dbname='mydb.db'):
try:
self.connection = sqlite3.connect(dbname)
except:
print('Error')
finally:
pass
class Hello:
def hi(self):
db = DB('test.db')
cursor = db.connection.cursor()
db = DB('test.db')
h = Hello() # make our instance
h.hi() # use the method "hi" associated with the class (our function name within the class)
@ralex спасибо за дополнительную информацию! Я думаю, что понял это с помощью своего редактирования, OP никогда не вызывал метод hi класса Hello
@Reedinationer, спасибо. Второй подход ведет себя точно так же, как у меня сейчас. В целях тестирования да, наличие всего в одном классе упрощает задачу, но мне было интересно, смогу ли я сохранить структуру. Позвольте мне снова попробовать ваш первый подход
@Reedinationer спасибо за попытку, но он вообще не берет db_test.db
@NieSelam Откуда ты знаешь, что он его не принимает? Делаете ли вы что-нибудь с курсором, что приводит к выводу данных на консоль? Во втором примере строка db = DB() в классе Hello по умолчанию будет иметь значение «mydb.db». Вам нужно изменить его на db = DB('test.db')
@Reedinationer мои тесты не проходят, потому что в db.db есть данные, а в test.db нет данных. db = DB() # Создать базу данных или подключиться к существующей в методе hi() инициализирует ее с помощью db.db, а не test.db. Я решил использовать объявление пути к базе данных, которое я сейчас перезаписываю из test.py.
@NieSelam Разве это не сработает с тем, как я отредактировал второй пример сейчас? Если вы пытаетесь Hello подключиться к «test.db», вам нужно будет предоставить эту информацию, поскольку по умолчанию она будет «mydb.db».
Обычно рекомендуется протестировать код с помощью временной базы данных. Здесь полезен база данных в памяти Sqlite.