Python断言NDB项相等
我正在为一个从数据库检查ndb实体的项目编写一个单元测试 下面的测试Python断言NDB项相等,python,unit-testing,google-app-engine,Python,Unit Testing,Google App Engine,我正在为一个从数据库检查ndb实体的项目编写一个单元测试 下面的测试 def test_active_chains(self): chains = self.user.active_chains() self.maxDiff = None self.assertItemsEqual(self.convert(self.chains), chains) 产生以下失败 AssertionError: Element counts were not equal: First
def test_active_chains(self):
chains = self.user.active_chains()
self.maxDiff = None
self.assertItemsEqual(self.convert(self.chains), chains)
产生以下失败
AssertionError: Element counts were not equal:
First has 1, Second has 0: Chain(key=Key('Chain', 4), active=False, address_1=u'20 St.Saviourgate', address_2=None, chain_id=None, country=None, county=u'North Yorkshire', created=datetime.datetime(2018, 2, 7, 13, 31, 56, 197427), deleted=False, eagle_eye_campaign_id=None, eagle_eye_compaign_channel=None, eagle_eye_drinki_channel=None, eagle_eye_offer_channel=None, geo_location=None, name=u'TestChain1', number_of_venues=0, phone=None, post_code=u'YO1 8NN', test_group=False, town=u'York', users=[Key('User_v2', 2)], uses_codes=False)
First has 1, Second has 0: Chain(key=Key('Chain', 3), active=False, address_1=u'20 St.Saviourgate', address_2=None, chain_id=None, country=None, county=u'North Yorkshire', created=datetime.datetime(2018, 2, 7, 13, 31, 56, 197553), deleted=False, eagle_eye_campaign_id=None, eagle_eye_compaign_channel=None, eagle_eye_drinki_channel=None, eagle_eye_offer_channel=None, geo_location=None, name=u'TestChain2', number_of_venues=0, phone=None, post_code=u'YO1 8NN', test_group=False, town=u'York', users=[Key('User_v2', 2)], uses_codes=False)
First has 0, Second has 1: Chain(key=Key('Chain', 3), active=False, address_1=u'20 St.Saviourgate', address_2=None, chain_id=None, country=None, county=u'North Yorkshire', created=datetime.datetime(2018, 2, 7, 13, 31, 56, 197553), deleted=False, eagle_eye_campaign_id=None, eagle_eye_compaign_channel=None, eagle_eye_drinki_channel=None, eagle_eye_offer_channel=None, geo_location=None, name=u'TestChain2', number_of_venues=0, phone=None, post_code=u'YO1 8NN', test_group=False, town=u'York', users=[Key('User_v2', 2)], uses_codes=False)
First has 0, Second has 1: Chain(key=Key('Chain', 4), active=False, address_1=u'20 St.Saviourgate', address_2=None, chain_id=None, country=None, county=u'North Yorkshire', created=datetime.datetime(2018, 2, 7, 13, 31, 56, 197427), deleted=False, eagle_eye_campaign_id=None, eagle_eye_compaign_channel=None, eagle_eye_drinki_channel=None, eagle_eye_offer_channel=None, geo_location=None, name=u'TestChain1', number_of_venues=0, phone=None, post_code=u'YO1 8NN', test_group=False, town=u'York', users=[Key('User_v2', 2)], uses_codes=False)
我们可以看到断言中被比较的元素是完全相同的,因此为什么断言不承认元素相等?
我认为这与从数据库中提取的项目有关,因此存储在不同的内存位置。assertItemsEqual是否需要与所比较模型相同的内存位置
注意:
我没有包含代码中的任何方法(即convert()或active_chains()),因为我认为问题不在这里。如果需要,我可以包括
替代解决方案:
我通过创建以下函数找到了解决方法
def checkAssertItems(self, item1, item2):
res = self.assertEqual(len(item1), len(item2))
if res:
for i in range(0, len(item1)):
self.assertEqual(item1[i], item2[i])
def checkAssertItems(self, item1, item2):
res = self.assertEqual(len(item1), len(item2))
if res:
for i in range(0, len(item1)):
self.assertEqual(item1[i], item2[i])
并将我的单元测试替换为
def test_active_chains(self):
chains = self.user.active_chains()
self.maxDiff = None
self.checkAssertItems(self.convert(self.chains), chains)
def test_active_chains(self):
chains = self.user.active_chains()
self.maxDiff = None
self.checkAssertItems(self.convert(self.chains), chains)
我很想知道为什么不能直接比较ndb.Models。我通过创建以下函数找到了解决方法
def checkAssertItems(self, item1, item2):
res = self.assertEqual(len(item1), len(item2))
if res:
for i in range(0, len(item1)):
self.assertEqual(item1[i], item2[i])
def checkAssertItems(self, item1, item2):
res = self.assertEqual(len(item1), len(item2))
if res:
for i in range(0, len(item1)):
self.assertEqual(item1[i], item2[i])
并将我的单元测试替换为
def test_active_chains(self):
chains = self.user.active_chains()
self.maxDiff = None
self.checkAssertItems(self.convert(self.chains), chains)
def test_active_chains(self):
chains = self.user.active_chains()
self.maxDiff = None
self.checkAssertItems(self.convert(self.chains), chains)
我很想知道为什么我不能直接比较ndb.Model。您可以使用
self.assertEqual(a,b)
来比较两个ndb.Model
实例,它很有效
您还可以使用self.assertEqual(a,b)
来比较两个列表。比较将是元素方面的。因此,如果您有两个以相同顺序包含ndb.Model
的列表,它们将进行相等的比较
self.assertItemsEqual(a,b)
对两个列表进行排序a
,b
,然后进行比较;除非定义排序顺序,否则排序顺序将返回到按内存位置排序。这可能不是您想要的。我不清楚self.user.active\u chains()和self.chains()中的项目来自何处。如果您在两个列表上循环并执行id(chain)
,您是否获得相同的对象id?