'Python SQLAlemchy mock testing --- data stubbing
I am trying to use the mock-alchemy for data stubbing mock unittesting. I am following this example
To run the code, I have some modification like this:
demo_test.py
import datetime
import unittest
from unittest import mock
import pytest
from mock_alchemy.mocking import UnifiedAlchemyMagicMock
from mock_demo.data_analysis import complex_data_analysis, Data1, Data2, Data3, CombinedAnalysis
class TestMockDemo(unittest.TestCase):
def test_data_analysis(self):
stop_time = datetime.datetime.utcnow()
cfg = {
"final_time": stop_time
}
data1_values = [
Data1(1, 10, 11, 12),
Data1(2, 20, 21, 22),
Data1(3, 30, 31, 32),
]
data2_values = [
Data2(1, 10, 11, 12),
Data2(2, 20, 21, 22),
Data2(3, 30, 31, 32),
]
data3_values = [
Data3(1, 10, 11, 12),
Data3(2, 20, 21, 22),
Data3(3, 30, 31, 32),
]
session = UnifiedAlchemyMagicMock(data=[
(
[mock.call.query(Data1),
mock.call.filter(Data1.data_val1 < 20)],
data1_values
),
(
[mock.call.query(Data2),
mock.call.filter(Data2.data_val2 < 30)],
data2_values
),
(
[mock.call.query(Data3),
mock.call.filter(Data3.data_val3 < 40)],
data3_values
),
])
complex_data_analysis(cfg, session)
expected_anyalsis = [
CombinedAnalysis(1, 10, 11, 12),
CombinedAnalysis(2, 20, 21, 22),
CombinedAnalysis(3, 30, 31, 32),
]
combined_anyalsis = session.query(CombinedAnalysis).all()
print(combined_anyalsis)
print(expected_anyalsis)
assert sorted(combined_anyalsis, key=lambda x: x.pk1) == sorted(expected_anyalsis, key=lambda x: x.pk1)
if __name__ == "__main__":
unittest.main()
data_analysis.py
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
# assume similar classes for Data2 and Data3
class Data1(Base):
__tablename__ = 'some_table'
pk1 = Column(Integer, primary_key=True)
data_val1 = Column(Integer)
data_val2 = Column(Integer)
data_val3 = Column(Integer)
def __init__(self, pk1, val1, val2, val3):
self.pk1 = pk1
self.data_val1 = val1
self.data_val2 = val2
self.data_val3 = val3
class Data2(Base):
__tablename__ = 'some_table_003'
pk1 = Column(Integer, primary_key=True)
data_val1 = Column(Integer)
data_val2 = Column(Integer)
data_val3 = Column(Integer)
def __init__(self, pk1, val1, val2, val3):
self.pk1 = pk1
self.data_val1 = val1
self.data_val2 = val2
self.data_val3 = val3
class Data3(Base):
__tablename__ = 'some_table_004'
pk1 = Column(Integer, primary_key=True)
data_val1 = Column(Integer)
data_val2 = Column(Integer)
data_val3 = Column(Integer)
def __init__(self, pk1, val1, val2, val3):
self.pk1 = pk1
self.data_val1 = val1
self.data_val2 = val2
self.data_val3 = val3
class CombinedAnalysis(Base):
__tablename__ = 'some_table_002'
pk1 = Column(Integer, primary_key=True)
analysis_val1 = Column(Integer)
analysis_val2 = Column(Integer)
analysis_val3 = Column(Integer)
def __init__(self, pk1, val1, val2, val3):
self.pk1 = pk1
self.analysis_val1 = val1
self.analysis_val2 = val2
self.analysis_val3 = val3
def __eq__(self, other):
if not isinstance(other, CombinedAnalysis):
return NotImplemented
return (
self.analysis_val1 == other.analysis_val1
and self.analysis_val2 == other.analysis_val2
and self.analysis_val3 == other.analysis_val3
)
def analysis(dataset_first, dataset_second):
return dataset_first
def intergrate_analysis(d_1, d_2, d_3):
return d_1
def complex_data_analysis(cfg, session):
# collects some data upto some point
dataset1 = session.query(Data1).filter(Data1.data_val1 < 20)
dataset2 = session.query(Data2).filter(Data2.data_val2 < 30)
dataset3 = session.query(Data3).filter(Data3.data_val3 < 40)
# performs some analysis
analysis12 = analysis(dataset1, dataset2)
analysis13 = analysis(dataset1, dataset3)
analysis23 = analysis(dataset2, dataset3)
# combine the data analysis (returns object CombinedAnalysis)
combined_analysis = intergrate_analysis(analysis12, analysis13, analysis23)
# assume the combined_analysis are stored in some SQL table
session.add_all(combined_analysis)
session.commit()
I then run the test case and trying to print out the result of the query with this command:
combined_anyalsis = session.query(CombinedAnalysis).all()
print(combined_anyalsis)
and here is the output:
[]
That is an empty list. I would like to ask if anyone knows how can I insert data into the session and perform the test case?
Thanks
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
