Soru UnitT testini assertRaises () NoneType nesnelerle düzgün şekilde nasıl kullanabilirim? [çift]


Bu sorunun zaten bir cevabı var:

Basit bir test vakası yaptım:

def setUp(self):

  self.testListNone = None

def testListSlicing(self):

  self.assertRaises(TypeError, self.testListNone[:1])

ve testin geçmesini bekliyorum ama istisna yapıyorum:

Traceback (most recent call last):

    self.assertRaises(TypeError, self.testListNone[:1])

TypeError: 'NoneType' object is unsubscriptable

TypeError istisnasından bu yana assertRaises'ın geçeceğini düşündüm yükseltilmek mi


133
2018-05-23 22:38


Menşei




Cevaplar:


Python2.7 veya üzerindeyseniz, assertRaises İçerik yöneticisi olarak kullanmak ve yapmak:

with self.assertRaises(TypeError):
    self.testListNone[:1]

Python2.6'yı şu ana kadar kullanmış olmanın başka bir yolunu kullanmaksa unittest2 python2.6 için yeni bir özellik olan bir arka kapı olan ve yukarıdaki kodu kullanarak çalışmasını sağlayabilirsiniz.

N.B: Yeni özelliklerin (SkipTest, test keşfi ...) büyük bir hayranıyım, bu yüzden unittest2'yi olabildiğince kullanma niyetindeyim. Aynı şeyi yapmamızı tavsiye ederim çünkü python2.6'da en uygun olanlardan çok daha fazlası var.


199
2018-05-23 23:00





Sorun şu ki TypeError 'önce' büyüdü assertRaises argümanlar beri denir assertRaises Yöntem çağrılmadan önce değerlendirilmesi gerekir. Bir geçmen lazım lambda ifade gibi:

self.assertRaises(TypeError, lambda: self.testListNone[:1])

108
2018-05-23 22:53



Muhtemelen en iyi cevap - Christophe Roussy
Bana ilgili bir soruda yardım edebilir misiniz? stackoverflow.com/questions/39909935/... - Borat Sagdiyev
@Unutbu'nun cevabı nasıl arayacağınızı gösteriyor assertRaises (lambda gerekli değildir) - bahmait


Kullanılacak normal yol assertRaises bir işlevi çağırmaktır:

self.assertRaises(TypeError, test_function, args)

işlev çağrısı test_function (args) bir TypeError yükselttiğini test etmek için.

İle ilgili sorun self.testListNone[:1] Python ifadeyi hemen önce değerlendirir, assertRaises yöntem denir. Tüm nedeni neden test_function ve args ayrı argümanlar olarak iletilir self.assertRaises izin vermek assertRaises aramak test_function(args) içinden bir try...except engellemek assertRaises istisnayı yakalamak için.

Tanımladığınızdan beri self.testListNone = Noneve aramak için bir işleve ihtiyacınız var, kullanabilirsiniz operator.itemgetter bunun gibi:

import operator
self.assertRaises(TypeError, operator.itemgetter, (self.testListNone,slice(None,1)))

dan beri

operator.itemgetter(self.testListNone,slice(None,1))

uzun soluklu bir deyiş self.testListNone[:1]ama işlevi ayıran (operator.itemgetter) argümanlardan.


69
2018-05-23 22:46



Tek bir assertRaises için, bu en iyi cevaba benziyor. Büyük bir istisna tabanlı testler için (hepsi aynı istisna tipine sahip olduklarını varsayarak) self.assertRaises (...) ile iyi bir seçim olacaktır. - user632657
Evet, bu sorunun cevabını verdiğinden doğru cevap olmalı. - Henry Gomersall
Bu kesinlikle sorunu açıklayan doğru cevaptır. - Ismael
Bana ilgili bir soruda yardım edebilir misiniz? stackoverflow.com/questions/39909935/... - Borat Sagdiyev


Tam snippet aşağıdaki gibi görünürdü. Hata mesajını (veya genel olarak kabul etmek için @ mouad'ın cevabını genişletir. str onun temsili args) yararlı olabilir.

from unittest import TestCase


class TestNoneTypeError(TestCase):

  def setUp(self): 
    self.testListNone = None

  def testListSlicing(self):
    with self.assertRaises(TypeError) as ctx:
        self.testListNone[:1]
    self.assertEqual("'NoneType' object is not subscriptable", str(ctx.exception))

4
2017-09-07 12:46