unittest unit test mock python testing mocking assert

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?