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

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...

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

The number of nodes and edges I calculated manually and by a method provided by networkx library dont match

I am trying to analyse a graph using networkx library in Python. I have implemented a function that returns the nodes and edges of that graph. After that I counted the number of nodes and edges by implementing the len() function for nodes and edges, which gave me 17 for both nodes and edges. However, when I used the method graph.number_of_nodes() of networkx library it gave me 53. My code: import pandas as pd import networkx as nx import matplotlib.pyplot as plt header_list = ["a","b","w"] E =pd.read_csv("aves-barn-swallow-contact-network.edges",sep=" ",header= None,names=header_list) # print(E.head()) # prints first few rows of the csv file G = nx.from_pandas_edgelist(E,"a","b",["w"]) nx.draw(G) plt.show() class GraphAnalyse: #finding nodes and edges def nodeEdge(self,Graph): nodes = Graph.nodes() edges = Graph.edges() ...