Мое текущее решение - использовать патч для переопределения метода __eq__
DataFrame.Вот пример с Pandas, так как его быстрее тестировать, идея должна применяться к любому объекту.
import pandas as pd
# use this import for python3
# from unittest.mock import patch
from mock import patch
def custom_df_compare(self, other):
# Put logic for comparing df's here
# Returning True for demonstration
return True
@patch("pandas.DataFrame.__eq__", custom_df_compare)
def test_df_equal():
df1 = pd.DataFrame(
{"id": [1, 2, 3], "name": ["a", "b", "c"]}, columns=["id", "name"]
)
df2 = pd.DataFrame(
{"id": [2, 3, 4], "name": ["b", "c", "d"]}, columns=["id", "name"]
)
assert df1 == df2
Еще не пробовал, но планирую добавить его в качестве прибора и использовать autouse
дляиспользуйте его для всех тестов автоматически.
Чтобы элегантно обработать индикатор «порядок имеет значение», я играю с подходом, похожим на pytest.approx
, который возвращает новый класс со своим собственным __eq__
, например:
class SortedDF(object):
"Indicates that the order of data matters when comparing to another df"
def __init__(self, df):
self.df = df
def __eq__(self, other):
# Put logic for comparing df's including order of data here
# Returning True for demonstration purposes
return True
def test_sorted_df():
df1 = pd.DataFrame(
{"id": [1, 2, 3], "name": ["a", "b", "c"]}, columns=["id", "name"]
)
df2 = pd.DataFrame(
{"id": [2, 3, 4], "name": ["b", "c", "d"]}, columns=["id", "name"]
)
# Passes because SortedDF.__eq__ is used
assert SortedDF(df1) == df2
# Fails because df2's __eq__ method is used
assert df2 == SortedDF(df2)
Незначительная проблема, которую я не смог решить, - это ошибка второго утверждения, assert df2 == SortedDF(df2)
.Этот порядок отлично работает с pytest.approx
, но не здесь.Я попытался прочитать оператор ==
, но не смог выяснить, как исправить второй случай.