pruebas unitarias: método simulado con argumentos exactos en Python

CorePress2024-01-24  9

En Python 3+

def some_method():
   href = browser.find_element_by_css_selector('div').get_attribute('href')
   title = browser.find_element_by_css_selector('div > a').get_attribute('title')
   text = browser.find_element_by_css_selector('div > p > h2').get_attribute('title')

Este es un fragmento de código y estaba realizando pruebas unitarias en él, pero no pude obtener el resultado exacto esperado. Para el código anterior, solo necesito simular browser.find_element_by_css_selector('div').get_attribute('href') para poder pasar mi enlace personalizado en lugar de obtenerlo desde el navegador.

probado hasta ahora:

@patch.object(WebElement,'get_attribute',return_value = 'some_url')

Si parcheo este método get_attribute, se burlarán de él en todos los lugares que no quiero.

 when(WebElement).get_attribute('href').thenReturn('some-url')
 expect(WebElement,atleast=1).get_attribute(eq("href")).thenReturn('some-url')

Y si me burlo de esto usando mockito, obtengo errores en las siguientes líneas. Intenté usar cuando y esperar pero nada funcionó

Exception caught:
Called but not expected: get_attribute('title')
    Stubbed invocations are:
         get_attribute('href')
         get_attribute(<Eq: href>)

¿Cómo podemos devolver el valor simulado con múltiples llamadas con argumentos exactos? Por ejemplo: si el parámetro que se pasa en css_selector y get_attributes son div y href, entonces rDevuelve alguna URL falsa. Si los valores son p > div y title luego devuelven otro valor falso y lo dejan como está para el resto de las llamadas



------------------------------------

En lugar de simplemente establecer un valor de retorno para el simulacro, ¿podrías usar una función side_effect? La función de efecto secundario podría luego probar si "href" es el atributo que se está obteniendo, si es así, devolverá su enlace personalizado; de lo contrario, devolverá la llamada a la función original.

4

¿Puede darnos un ejemplo de lo mismo? No puedo entenderte correctamente

-Deepak Sharma

28/03/2021 a las 16:46

Eche un vistazo a stackoverflow.com/a/51591390/12694095 esencialmente, en lugar de return_value, use side_effect para llamar a una función simple que toma la clave de atributo como un argumento y luego verifique si ese argumento es == 'href', si es devolver su enlace personalizado; de lo contrario, devolver la función original pasada con la clave de atributo. ¡Hermoso!

- ModellingGeek

28/03/2021 a las 18:34

También lo intenté de esa manera, pero aún así tuve problemas. Hay varias líneas con el mismo get_attribute('href') pero difieren según el valor que va dentro de find_element_by_css_selector('difiere-by-this-value')

-Deepak Sharma

29/03/2021 a las 17:25

No estoy seguro, pero como necesita simular una combinación específica de argumentos para un método desde una función de llamada configurada específicamente, tal vez valga la pena explorar si su side_effect puede hacer una introspección de la configuración de la función de llamada y decidir qué acción tomar en función de estos valores. Quizás puedas usar el método método_calls del objeto simulado docs.python.org/3/library/…

- ModellingGeek

29/03/2021 a las 18:43



------------------------------------

En Mockito, es

spy2(WebElement.get_attribute)
when(WebElement).get_attribute('href').thenReturn('some-url')

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare