it-swarm.dev

Apakah ada cara untuk memeriksa dengan Python unittest menegaskan jika iterable tidak kosong?

Setelah mengirimkan pertanyaan ke layanan, saya mendapatkan kamus/daftar kembali dan saya ingin memastikan itu tidak kosong. Saya di Python 2.7.

Saya terkejut saya tidak melihat metode assertEmpty untuk unittest.TestCase instance kelas.

Alternatif yang ada seperti:

self.assertTrue(bool(d))

dan

self.assertNotEqual(d,{})

dan

self.assertGreater(len(d),0)

tidak terlihat benar.

Apakah metode semacam ini tidak ada dalam Python kerangka kerja yang tidak terprogram? Jika ya, apa cara paling Pythonic untuk menyatakan bahwa iterable tidak kosong?

49
Alex Tereshenkov

Daftar kosong/dicts mengevaluasi ke False, jadi self.assertTrue(d) menyelesaikan pekerjaan.

76
gplayer

Tergantung apa yang Anda cari.

Jika Anda ingin memastikan objek itu dapat diubah dan tidak kosong:

# TypeError: object of type 'NoneType' has no len()
# if my_iterable is None
self.assertTrue(len(my_iterable))

Jika OK untuk objek yang diuji adalah None:

self.assertTrue(my_maybe_iterable)
8
Josh J

Seperti yang telah disebutkan oleh @ gplayer: mungkin untuk memeriksa non kekosongan dengan assertTrue() (dan sebaliknya dengan assertFalse() untuk kekosongan tentu saja).

Tapi, seperti @Alex Tereshenkov sebelumnya telah tunjukkan dalam komentar, semua metode assertTrue() dan assertFalse() ini mengacaukan kode dan agak menyesatkan karena kami ingin memeriksa kekosongan.

Jadi demi kode pembersih, kita dapat mendefinisikan metode assertEmpty() dan assertNotEmpty() kita sendiri:

def assertEmpty(self, obj):
    self.assertFalse(obj)

def assertNotEmpty(self, obj):
    self.assertTrue(obj)
1
winklerrr

Mungkin:

self.assertRaises(StopIteration, next(iterable_object))
0
Eugene Soldatov

Semua kredit untuk ini berlaku untuk winklerrr, saya hanya memperluas idenya: miliki mixin yang dapat diimpor ketika Anda membutuhkan assertEmpty atau assertNotEmpty:

class AssertEmptyMixin( object ):
    def assertEmpty(self, obj):
        self.assertFalse(obj)

class AssertNotEmptyMixin( object ):
    def assertNotEmpty(self, obj):
        self.assertTrue(obj)

Peringatan, mixin harus di kiri:

class MyThoroughTests( AssertNotEmptyMixin, TestCase ):
    def test_my_code( self ):
        ...
        self.assertNotEmpty( something )
0
Rick Graves