Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python断言NDB项相等_Python_Unit Testing_Google App Engine - Fatal编程技术网

Python断言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

我正在为一个从数据库检查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 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?