How can I create mock a manytomany field for django pytest?

53 Views Asked by At

I am trying to create mock data for test in django.

I have team model like this:

class Team(TimeStampedModel):

    id: int
    created: datetime
    name = models.CharField(max_length=100)
    members = models.ManyToManyField(
        settings.AUTH_USER_MODEL, related_name="teams", through="Membership"
    )

And here is the part of test file:

class TestTeamListViews:
    def test_team_list(
        self, client: Client, mocker, site_admin_user: User, team_with_members: Team
    ):
        admin1 = team_with_members.members.get(email="[email protected]")
        mock_teams = [
            Team(
                id=1,
                name="Test Team",
                members=admin1,
                created=datetime.datetime.now(),
            )
        ]

This case, I get error:

    def __set__(self, instance, value):
>       raise TypeError(
            "Direct assignment to the %s is prohibited. Use %s.set() instead."
            % self._get_set_deprecation_msg_params(),
        )
E       TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use members.set() instead.

So, I tried

class TestTeamListViews:
    def test_team_list(
        self, client: Client, mocker, site_admin_user: User, team_with_members: Team
    ):
        admin1 = team_with_members.members.get(email="[email protected]")
        mock_teams = [
            Team(
                id=1,
                name="Test Team",
                members=Team.members.set(admin1),
                created=datetime.datetime.now(),
            )
        ]

Then, I get error: AttributeError: 'ManyToManyDescriptor' object has no attribute 'set' I googled a lot, but there is no solutions I could found other than using add instead of set. Using add gives same error.

Please help me.

0

There are 0 best solutions below