Skip to main content

Pytest - Mocking property and setter

I'm having a real hard time understanding how to mock a class that has a property and setter fixtures that access a "private" attribute.

import pytest
from pytest_mock import MockFixture
from unittest.mock import MagicMock
from typing import List

class MyEntity:

    _my_list: List[str] = []

    def __init__(self, list_vals = []):
        self._my_list = list_vals

    @property
    def my_list(self) -> List[str]:
        return self._my_list

    @my_list.setter
    def my_list(self, value: List[str]):
        self._my_list = value

    def append(self, value: str):
        self._my_list.append(value)


class Foo:

    def generate_entity(self, list_vals: List[str]) -> MyEntity:
        return MyEntity()

    def set_values(self, entity: MyEntity, list_vals: List[str]) -> MyEntity:
        entity.my_list = list_vals
        return entity

    def add_value(self, entity: MyEntity, value: str) -> MyEntity:
        entity.append(value)
        return entity


@pytest.fixture
def mock_my_entity(mocker: MockFixture) -> MagicMock:

    namespace = f"{__name__}.{MyEntity.__name__}"
    mock_my_entity = mocker.patch(namespace, autospec=True)

    return mock_my_entity.return_value

def test_foo(mock_my_entity):

    expect_list_values = ["Hello", "World"]

    foo = Foo()
    entity = foo.generate_entity(expect_list_values)
    assert len(entity._my_list) == 0

    entity = foo.set_values(entity, expect_list_values)
    assert entity._my_list == expect_list_values

    expected_extra_value = "more"
    entity = foo.add_value(entity, expected_extra_value)
    assert entity._my_list == expect_list_values + expected_extra_value

After running the test, this is what I get:

mock_my_entity = <NonCallableMagicMock name='MyEntity()' spec='MyEntity' id='4351847632'>

    def test_foo(mock_my_entity):
    
        expect_list_values = ["Hello", "World"]
    
        foo = Foo()
        entity = foo.generate_entity(expect_list_values)
        assert len(entity._my_list) == 0
    
        entity = foo.set_values(entity, expect_list_values)
>       assert entity._my_list == expect_list_values
E       AssertionError: assert <MagicMock na...='4362862544'> == ['Hello', 'World']
E         Right contains 2 more items, first extra item: 'Hello'
E         Full diff:
E         - <MagicMock name='MyEntity()._my_list' spec='list' id='4362862544'>
E         + ['Hello', 'World']

scratchpad.py:58: AssertionError

I've also tried using PropertyMock in various ways, but nothing seems to work.

How do I get this to work. How do I mock the MyEntity class so that everything works the way it should?



source https://stackoverflow.com/questions/70464598/pytest-mocking-property-and-setter

Comments

Popular posts from this blog

Prop `className` did not match in next js app

I have written a sample code ( Github Link here ). this is a simple next js app, but giving me error when I refresh the page. This seems to be the common problem and I tried the fix provided in the internet but does not seem to fix my issue. The error is Warning: Prop className did not match. Server: "MuiBox-root MuiBox-root-1" Client: "MuiBox-root MuiBox-root-2". Did changes for _document.js, modified _app.js as mentioned in official website and solutions in stackoverflow. but nothing seems to work. Could someone take a look and help me whats wrong with the code? Via Active questions tagged javascript - Stack Overflow https://ift.tt/2FdjaAW

How to show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console