2017-01-12 13 views
8

unittest.TestCase имеет assertCountEqual method (assertItemsEqual в Python 2, который, возможно, лучшее название), который сравнивает два итерируемых и проверяет, что они содержат одинаковое количество одних и тех же объектов, без учета их заказ.ли pytest есть assertItemsEqual/assertCountEqual эквивалент

Обеспечивает ли pytest нечто подобное? Все очевидные альтернативы (например, звонки set(x), или Counter(list(x)) с каждой стороны, как указано в документации) не работают, потому что вещи, которые я сравниваю, это списки словарей, а словари не являются хешируемыми.

+1

Почему «сортировка» не работает? Это не требует ничего хешируемого. –

+0

Я согласен с @ TheCompiler. Единственное, что вам нужно, это указать параметр «ключ» для сравнения словарей: http://stackoverflow.com/questions/72899/how-do-i-sort-a-list-of-dictionaries-by-values-of-the -dictionary-в-питон. –

+1

@ TheCompiler Нет, вы правы, но для этого нужны вещи, которые вы сортируете, чтобы быть сопоставимыми с>, которые dicts нет. –

ответ

1

pytest не дает assertCountEqual, но мы можем просто использовать UnitTest-х:

import unittest 

def test_stuff(): 
    case = unittest.TestCase() 
    a = [{'a': 1}, {'b': 2}] 
    b = [{'b': 2}] 
    case.assertCountEqual(a, b) 

И выход пристойно, слишком

$ py.test 
============================= test session starts ============================== 
platform linux -- Python 3.6.2, pytest-3.2.1, py-1.4.34, pluggy-0.4.0 
rootdir: /home/they4kman/.virtualenvs/tmp-6626234b42fb350/src, inifile: 
collected 1 item 

test_stuff.py F 

=================================== FAILURES =================================== 
__________________________________ test_stuff __________________________________ 

    def test_stuff(): 
     case = unittest.TestCase() 
     a = [{'a': 1}, {'b': 2}] 
     b = [{'b': 2}] 
>  case.assertCountEqual(a, b) 

test_stuff.py:7: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.6/unittest/case.py:1182: in assertCountEqual 
    self.fail(msg) 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <unittest.case.TestCase testMethod=runTest> 
msg = "Element counts were not equal:\nFirst has 1, Second has 0: {'a': 1}" 

    def fail(self, msg=None): 
     """Fail immediately, with the given message.""" 
>  raise self.failureException(msg) 
E  AssertionError: Element counts were not equal: 
E  First has 1, Second has 0: {'a': 1} 

/usr/lib/python3.6/unittest/case.py:670: AssertionError 
=========================== 1 failed in 0.07 seconds ========================== 

Side Примечание: the implementation of assertCountEqual включает в себя филиал специально для непроверенных типов, которые does a bunch of bookkeeping and compares each item with every other item.

 Смежные вопросы

  • Нет связанных вопросов^_^