es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo escribir pruebas con pytest para pymssql?

Estoy intentando escribir un pytest para probar el siguiente método haciendo mock de la base de datos. ¿Cómo puedo hacer un mock de la conexión a la base de datos sin conectarme realmente al servidor de base de datos real? Intenté con un caso de prueba de muestra, pero no estoy seguro de si ese es el modo correcto de hacerlo. Por favor, corríjame si estoy equivocado.

//fetch.py

<p>import pymssql</p>

<p>def cur<em>fetch(query):
    with pymssql.connect('host', 'username', 'password') as conn:
        with conn.cursor(as</em>dict=True) as cursor:
            cursor.execute(query)
            response = cursor.fetchall()
    return response</p>

<p>//test_fetch.py</p>

<p>import mock
from unittest.mock import MagicMock, patch
from .fetch import cur<em>fetch
def test</em>cur<em>fetch():
    with patch('fetch.pymssql', autospec=True) as mock</em>pymssql:
        mock<em>cursor = mock.MagicMock()
        test</em>data = [{'password': 'secret', 'id': 1}]
        mock<em>cursor.fetchall.return</em>value = MagicMock(return<em>value=test</em>data)
        mock<em>pymssql.connect.return</em>value.cursor.return<em>value.<strong>enter</strong>.return</em>value = mock<em>cursor
        x = cur</em>fetch({})
        assert x == None

El resultado es:

AssertionError: assert <MagicMock name='pymssql.connect().<strong>enter</strong>().cursor().<strong>enter</strong>().fetchall()' id='2250972950288'> == None

Por favor, ayúdame.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para simular la conexión a una base de datos en un pytest sin conectarse al verdadero servidor de base de datos, se debe utilizar la biblioteca unittest.mock. Aquí se presenta un enfoque de ejemplo para probar la función cur_fetch mientras se simula la base de datos:

    #fetch.py
    
    import pymssql
    
    def cur_fetch(query):
        with pymssql.connect('host', 'username', 'password') as conn:
            with conn.cursor(as_dict=True) as cursor:
                cursor.execute(query)
                response = cursor.fetchall()
        return response
    
    
    #test_fetch.py
    
    from unittest.mock import MagicMock, patch
    from fetch import cur_fetch
    
    def test_cur_fetch():
        # crear objeto de conexión pymssql simulada
        mock_conn = MagicMock()
    
        # crear objeto de cursor simulado con método fetchall
        mock_cursor = MagicMock()
        test_data = [{'password': 'secret', 'id': 1}]
        mock_cursor.fetchall.return_value = test_data
    
        # establecer que el cursor devuelva los datos simulados al ejecutar una consulta
        mock_conn.cursor.return_value.__enter__.return_value = mock_cursor
    
        # usar el patch para simular la función pymssql connect con nuestro objeto simulado
        with patch('pymssql.connect', return_value=mock_conn):
            # llamar a la función cur_fetch con cualquier consulta
            result = cur_fetch('SELECT * FROM table')
    
        # asegurarse de que el resultado coincida con los datos simulados
        assert result == test_data
    

    En este enfoque, creamos una instancia de MagicMock para el objeto de conexión pymssql y el objeto de cursor. Luego, establecemos que el método fetchall del objeto de cursor devuelva nuestros datos simulados. Finalmente, usamos patch para simular la función pymssql connect con nuestro objeto de conexión simulado y llamamos a la función cur_fetch con nuestra consulta simulada. Finalmente, aseguramos que el resultado coincida con nuestros datos simulados.

Comments are closed.