Saya mencoba mencari tahu apakah ada cara untuk (pengujian unit) memverifikasi bahwa properti dan penyetel benar-benar dipanggil untuk mengatur atribut nama.

class DummyName:
    def __init__(self):
        self.name = ''

    @property
    def name(self):
        return self.name

    @name.setter
    def name(self, name):
        if not isinstance(name, basestring):
            raise Exception('Name must be a string.')
        self.name = name

Mencoba melakukan hal seperti ini...

@mock.patch.object(DummyName, 'name', new_callable=PropertyMock)
def testNameProperty(self, mock_name):
    MockName = Mock()
    mock_name.return_value = MockName
    dummyName = DummyName()
    dummyName.name = 'test_name'
    # assert setter is called to set the name
    # assert name is called to get the name
    # assert name is 'test_name'

Sepertinya name() dan setter tidak pernah diakses. yang Ada yang punya ide yang lebih baik? Terima kasih!

6
user2994871 14 Agustus 2017, 21:10

2 jawaban

Jawaban Terbaik

Dengan menggunakan tiruan seperti itu, Anda telah menimpa kode yang Anda coba uji. Mock adalah untuk panggilan yang berada di luar kode yang sedang diuji.

Tes yang tepat untuk kode ini adalah untuk menegaskan bahwa pengecualian dimunculkan jika Anda melewatkan sesuatu yang bukan string.

def testNameProperty(self):
    dummyName = DummyName()
    with self.assertRaises(Exception):
        dummyName.name = 12345
5
Daniel Roseman 14 Agustus 2017, 18:16

Kelas Anda perlu mewarisi dari object.

class DummyName(object):
    def __init__(self):
        self._name = ''

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        if not isinstance(name, basestring):
            raise Exception('Name must be a string.')
        self._name = name

Anda juga perlu menggunakan variabel yang berbeda untuk name di dalam kelas, atau Anda akan mencapai rekursi maksimum.

2
Cory Madden 14 Agustus 2017, 18:24