2017-08-31 2 views
3

最も簡単な方法:Python:オブジェクトが異なる場所にあるかどうかをチェックするユニットテスト?この1説明する

import unittest 
from element import Element 

class TestHTMLGen(unittest.TestCase): 

    def test_Element(self): 
     page = Element("html", el_id=False) 
     self.assertEqual(page, Element("html", el_id=False)) # this is where I need help 

は、私は次のエラーを取得する:

AssertionError: <element.Element object at 0x025C1B70> != <element.Element object at 0x025C1CB0> 

私は、オブジェクトがまったく同じではありませんが、それらが同じであることを確認するためにどのような方法があります知っていますか?私はassertEqualが動作すると思います。

編集:私はaddTypeEqualityFuncで作業しています。しかし、私はまだトラブル

def test_Element(self): 
    page = Element("html", el_id=False) 
    self.addTypeEqualityFunc(Element, self.are_elements_equal) 
    self.assertEqual(page, Element("html", el_id=False)) 

def are_elements_equal(self, first_element, second_element, msg=None): 
    print first_element.attribute == second_element.attribute 
    return type(first_element) is type(second_element) and first_element.tag == second_element.tag and first_element.attribute == second_element.attribute 

を持っていますこれは私が得る出力されます: 偽 、それはテストに合格言います。 first_element.attributeがsecond_element.attributeと等しくないため、渡すべきではありません。さらに、are_elements_equalの場合はreturn falseであっても、テストは引き続き行われます。

+0

要素をどのように表示することができますか?オブジェクトの初期化によって異なるプロパティ/属性が作成される可能性があります。あなたは正しいですが、assertEqualは本質的にオブジェクトが同じかどうかを判断するのに十分な '=='チェックを行います:[似たような質問](https://stackoverflow.com/questions/1227121/compare-object-instances-for -pythonでの属性の等価性)。また、独自の_eq_()メソッドを作成して、Python 2.5以上を使用しているかどうかを確認することもできます。 – ajoseps

+0

[addTypeEqualityFunc](https://docs.python.org/2/library/unittest.html)を作成することもできます#unittest.TestCase.addTypeEqualityFunc) – ajoseps

+0

@ajoseps編集を確認してください – BUInvent

答えて

1

ソリューション:

import unittest 
from element import Element 

class TestHTMLGen(unittest.TestCase): 

    def test_Element(self): 
     page = Element("html", el_id=False) 
     self.addTypeEqualityFunc(Element, self.are_elements_equal) 
     self.assertEqual(page, Element("html", el_id=False)) # this is where I need help 

    def are_elements_equal(self, first_element, second_element, msg=None): 
     self.assertEqual(type(first_element), type(second_element)) 
     self.assertEqual(first_element.tag, second_element.tag) 
     self.assertEqual(first_element.attribute, second_element.attribute) 

しかし、回self.assertEqual(vars(page), vars(Element("html", el_id=False)))の多くは、トリック

編集を行います。また、私は追加する必要があります。私はオブジェクトが等しいかどうかをチェックできるクールな小さな関数を作った。ほとんどの場合に動作するはずです。

def are_elements_equal(self, first_element, second_element, msg=None): 
    self.assertEqual(type(first_element), type(second_element)) 
    try: 
     type(vars(first_element)) is dict 
    except: 
     self.assertEqual(first_element, second_element) 
    else: 
     for i in vars(first_element).keys(): 
      try: 
       type(vars(vars(first_element)[i])) is dict 
      except: 
       if type(vars(first_element)[i]) is list: 
        for j in range(len(vars(first_element)[i])): 
         self.are_elements_equal(vars(first_element)[i][j], vars(second_element)[i][j]) 
       else: 
        self.assertEqual(vars(first_element)[i], vars(second_element)[i]) 
      else: 
       self.are_elements_equal(vars(first_element)[i], vars(second_element)[i]) 
関連する問題