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')