Опорный объект, созданный в середине функции с макетом - PullRequest
0 голосов
/ 03 сентября 2018

Если у меня есть такая функция:

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)

Я также хочу сослаться на эти разные объекты телефонных номеров, чтобы я мог проверить, что они также установлены правильно. Я не уверен, как получить ссылку на них.

1 Ответ

0 голосов
/ 03 сентября 2018

Вы можете получить доступ ко всем дочерним элементам vCard с помощью .getChildren() Например:

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'], а затем выполнить с ними связь.

...