【问题标题】:Reference object created in middle of function with unittest mock使用单元测试模拟在函数中间创建的引用对象
【发布时间】:2018-09-03 09:51:58
【问题描述】:

如果我有这样的功能:

def get_vcard():
    new_vcard = vobject.vCard()
    new_vcard.add('fn')
    new_card.fn.value = 'First Last'
    work_phone = new_vcard.add('tel')
    work_phone.value = '+18005555555'
    mobile_phone = new_vcard.add('tel')
    mobile_phone.value = '+18885555555'

还有这样的测试:

@patch('myapp.vobject.vCard', autospec=True)
def test_create_card(self, mock_vcard_constructor):
    mock_vcard = mock_vcard_constructor.return_value
    myapp.get_vcard()
    self.assertEqual('First Last', mock_vcard.fn.value)

我还想引用那些不同的电话号码对象,以便检查它们是否设置正确。我不确定如何获得对它们的引用。

【问题讨论】:

  • 这个测试没有意义。您不调用任何实际代码,您所做的只是断言您的模拟有一个值(它不会)。
  • 抱歉,这只是实际代码的一小部分。实际上,它不仅仅是一个函数,而是一个更大类的方法。我不认为所有的代码都是必要的。我将编辑原件。

标签: python python-unittest vobject


【解决方案1】:

您可以使用 .getChildren() 访问 vCard 的所有子项 例如:

def get_vcard(new_vcard=vobject.vCard()):
    new_vcard.add('fn')
    new_vcard.fn.value = 'First Last'
    work_phone = new_vcard.add('tel')
    work_phone.value = '+18005555555'
    mobile_phone = new_vcard.add('tel')
    mobile_phone.value = '+18885555555'

    return new_vcard

现在您的单元测试将如下所示:

def has_phone(vcard, value):
    for child in vcard.getChildren():
        if child.value == value:
            return True
    return False

@patch('myapp.vobject.vCard', autospec=True)
def test_create_card(self, mock_vcard_constructor):
    mock_vcard = get_vcard()

    self.assertEqual('First Last', mock_vcard.fn.value)
    self.assertTrue(has_phone(mock_vcard, '+18005555555'))
    self.assertTrue(has_phone(mock_vcard, '+18885555555'))

另一种可能性是使用vcard.contents['tel'] 访问所有电话号码,然后对其进行交互。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多