【问题标题】:Python Assert NDB Items equalPython 断言 NDB 项目相等
【发布时间】:2018-02-07 13:55:34
【问题描述】:

我正在为一个检查数据库中的 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 test_active_chains(self):
    chains = self.user.active_chains()
    self.maxDiff = None
    self.checkAssertItems(self.convert(self.chains), chains)

我很想知道为什么我不能直接比较 ndb.Models。

【问题讨论】:

  • 我不清楚 self.user.active_chains() 和 self.chains 中的项目来自哪里。如果您遍历这两个列表并执行id(chain),您获得的对象 ID 是否相同?

标签: python unit-testing google-app-engine


【解决方案1】:

我通过创建以下函数找到了解决方法

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)

我很想知道为什么我不能直接比较 ndb.Models。

【讨论】:

    【解决方案2】:

    您可以使用self.assertEqual(a, b) 比较两个ndb.Model 实例,它可以正常工作。

    您还可以使用self.assertEqual(a, b) 比较两个列表。比较将是元素方面的。因此,如果您有两个包含 ndb.Model 且顺序相同的列表,它们将比较相等。

    self.assertItemsEqual(a, b)ab这两个列表进行排序,然后进行比较;除非您定义排序顺序,否则排序顺序将回退到按内存位置排序。这可能不是你想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 2015-10-12
      • 2012-01-23
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多