Recommand · January 13, 2022 0

Python unittest mock SQLAlchemy model property

Following are my SQLAlchemy example models in Flask.

class Debtor(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode)


class DebtorBranch(db.Model):
    ... omitted properties

    debtor = db.relationship("Debtor")
    debtor_id = db.Column(
        db.Integer, db.ForeignKey("debtors.id")
    )

And I created a test that will mock the DebtorBranch.debtor relational field.

@mock.patch('services.debtor.models.DebtorBranch.debtor', new_callable=mock.PropertyMock)
def test_debtor_branch_debtor(self, mock_debtor_property):

    mock_debtor_property.side_effect = [
        DebtorBranch.debtor,
        Debtor(name='external_debtor_name')
    ]

    external_debtor = get_debtor_from_external_registry()

    debtor_branch = self.session.query(DebtorBranch)
            .join(Debtor, DebtorBranch.debtor)
            .filter(Debtor.id == external_debtor.id)
            .first()

    assert debtor_branch.debtor.name == external_debtor.official_name

However, whenever I access the DebtorBranch.debtor in .join(Debtor, DebtorBranch.debtor). It returns a MagicMock instance <MagicMock name='debtor()' id='281472612338208'> rather than the property itself.

Is there a possibility to return the DebtorBranch.debtor field from the side_effect even though it is the property to be mocked?