script - funciones en python ejercicios resueltos



¿Cómo simular llamadas de función encadenadas en python? (1)

Estoy usando la biblioteca mock escrita por Michael Foord para ayudarme con mis pruebas en una aplicación django.

Me gustaría probar que estoy configurando mi consulta correctamente, pero no creo que deba realmente llegar a la base de datos, así que estoy tratando de burlarme de la consulta.

Puedo burlarme bien de la primera parte de la consulta, pero no estoy obteniendo los resultados que me gustaría cuando encadené cosas adicionales.

La función:

    @staticmethod
    def get_policies(policy_holder, current_user):
        if current_user.agency:
            return Policy.objects.filter(policy_holder=policy_holder, version__agency=current_user.agency).distinct()
        else:
            return Policy.objects.filter(policy_holder=policy_holder)

y mi prueba: la primera afirmación pasa, la segunda falla.

    def should_get_policies_for_agent__user(self):
        with mock.patch.object(policy_models.Policy, "objects") as query_mock:
            user_mock = mock.Mock()
            user_mock.agency = "1234"
            policy_models.Policy.get_policies("policy_holder", user_mock)
            self.assertEqual(query_mock.method_calls, [("filter", (), {
                'policy_holder': "policy_holder",
                'version__agency': user_mock.agency,
            })])
            self.assertTrue(query_mock.distinct.called)

Estoy bastante seguro de que el problema es que el query_mock inicial está devolviendo un nuevo simulacro después de llamar al .filter (), pero no sé cómo capturar ese nuevo simulacro y asegurarme de que se haya llamado a .distinct ().

¿Hay una mejor manera de probar lo que estoy tratando de conseguir? Estoy tratando de asegurarme de que se está llamando la consulta adecuada.


Cada objeto simulado mantiene el objeto simulado que devolvió cuando se llama. Puede obtenerlo mediante la propiedad return_value de su objeto simulado.

Para tu ejemplo,

self.assertTrue(query_mock.distinct.called)

distinct no fue llamado en su simulacro, fue llamado en el valor de retorno del método de filtro de su simulacro, por lo que puede afirmar que distinto fue llamado haciendo esto

self.assertTrue(query_mock.filter.return_value.distinct.called)




mocking