0

«Попытка модульного тестирования моего кода с помощью unittest.mock python library». У меня есть код, который работает запросов к базе данных, очень похожие на это:Monkey patch cursor.execute() и close() или нет?

app.py:

from flask import g 
import mysql.connector 
@app.route('/') 
def create_table(): 
    g.db=mysql.connector.connect("credentials") 
    cursor = g.db.cursor() 
    cursor.execute('CREATE TABLE IF NOT EXISTS test(id INT NOT NULL PRIMARY KEY, name VARCHAR(40),email VARCHAR(40) NOT NULL)') 
    cursor.close() 
     g.db.close() 

Я дразнил мой g.db, используя метод ниже, но здесь я борюсь с тем, как макет cursor.execute() и cursor.close(). Любая помощь будет оценена по достоинству.

def testtable(): 
    with patch('app.mysql.connector') as mock_mysql_connector: 
    create_table() 
    print g.db 
    #mock execute and close# 

На печать g.db я получаю Mock имя и идентификатор, который я считаю, что означает g.db издевались, но я понятия не имею, как я должен издеваться execute() и close().

Должен ли я делать исправление обезьяны?
Если да, укажите подсказку о том, как обезьяна нападает на них?
Если нет, то какой другой способ их издеваться?

+0

Что вы хотите достичь? Это касается тестовых примеров (pytest и т. Д.?) – mstuebner

+0

@ mstuebner Я выполняю модульное тестирование с использованием библиотеки unittest.mock python и для тестирования вместо того, чтобы удалять базу данных. Я хочу издеваться над моим соединением, execute() и close() – immrsteel

ответ

1

Вы можете использовать patch.multiple:

from mock import patch, DEFAULT 

with patch.multiple('app', mysql=DEFAULT, g=DEFAULT) as dict: 
    # Mocking 
    connector = dict[̈́'mysql'].connector 
    db = connector.connect.return_value 
    cursor = db.cursor.return_value 
    # Run function to test 
    create_table() 
    # Assertions 
    assert dict['g'].db == db 
    db.close.assert_called_once_with() 
    cursor.close.assert_called_once_with() 
    connector.connect.assert_called_once_with("credentials") 
+0

Спасибо, Винсент, у меня есть некоторые вопросы, почему «курсор» установлен на return_value «db.cursor» и что «возвращаемые значения» мне нужно установить, как вы упомянули? – immrsteel

+0

Подумайте о чтении [краткое руководство по модулю модуля] (https://docs.python.org/3/library/unittest.mock.html#quick-guide), документация [mock class] (https://docs.python.org/3/library/unittest.mock.html#the -mock-class), и это [введение в насмешку в python] (http://www.toptal.com/python/an-introduction-to-mocking-in-python), чтобы понять, как использовать mocks. – Vincent

+0

Я прочитал документацию и понял, почему вы используете cursor = db.cursor.return_value, но я все еще путаюсь, когда вы упомянули #set return_value. Может, вы объясните мне это немного? – immrsteel

Смежные вопросы