unit - python 2.7 mock
Python''s assert_called_with, ¿hay un carácter comodín? (1)
Si llama a sendmail
con un subject
parámetro nombrado, entonces es mejor verificar si el argumento con nombre coincide con lo que espera:
args, kwargs = self.myclass.sendmail.call_args
self.assertEqual(kwargs[''subject''], "Hello World")
Esto supone que ambas implementaciones de sendmail
tienen un parámetro llamado subject
. Si ese no es el caso, puede hacer lo mismo con un parámetro posicional:
args, kwargs = self.myclass.sendmail.call_args
self.assertTrue("Hello World" in args)
Puede ser explícito sobre la posición del argumento (es decir, el primer argumento o el tercer argumento que se pasa a sendmail
pero eso depende de la implementación de sendmail
está probando).
Supongamos que tengo una clase en Python configurada así.
from somewhere import sendmail
class MyClass:
def __init__(self, **kargs):
self.sendmail = kwargs.get("sendmail", sendmail) #if we can''t find it, use imported def
def publish():
#lots of irrelevant code
#and then
self.sendmail(mail_to, mail_from, subject, body, format= ''html'')
Como puede ver, me he dado la opción de parametrizar qué función uso para self.sendmail
Ahora en el archivo de prueba.
Class Tester():
kwargs = {"sendmail": MagicMock(mail_from= None, mail_to= None, subject= None, body= None, format= None)}
self.myclass = MyClass(**kwargs)
##later on
def testDefaultEmailHeader():
default_subject = "Hello World"
self.myclass.publish()
self.myclass.sendmail.assert_called() #this is doing just fine
self.myclass.sendmail.assert_called_with(default_subject) #this is having issues
Por alguna razón recibo el mensaje de error
AssertionError: Expected call: mock(''Hello World'')
Actual Call : mock(''defaultmt'', ''defaultmf'', ''Hello World'', ''default_body'', format= ''html'')
Así que, básicamente, la afirmación espera que se llame a sendmail con una sola variable, cuando termina siendo llamado con todos 5. El problema es que no me importan las otras 4 variables. Solo quiero asegurarme de que se llame con el tema correcto.
Probé el titular de lugar simulado CUALQUIERA, y obtuve lo mismo
self.myclass.sendmail.assert_called_with(ANY, ANY, ''Hello World'', ANY, ANY)
AssertionError: Expected call: mock(<ANY>, <ANY>, ''Hello World'', <ANY>, <ANY>)
Actual Call : mock(''defaultmt'', ''defaultmf'', ''Hello World'', ''default_body, ''format= ''html'')
Realmente no estoy seguro de cómo proceder con este. ¿Alguien tiene algún consejo si solo nos importa una de las variables y queremos ignorar el resto?