Bir örnek yöntemiyle alay etmek için sahte yama kullanma


83

Hayali olarak adlandırılan Mock test kitaplığını kullanarak bir Django uygulamasını test ederken bir şeyle dalga geçmeye çalışıyorum . Tam olarak işe yarayamıyorum, bunu yapmaya çalışıyorum:

models.py

from somelib import FooClass

class Promotion(models.Model):
    foo = models.ForeignKey(FooClass)
    def bar(self):
       print "Do something I don't want!"


test.py

class ViewsDoSomething(TestCase):
    view = 'my_app.views.do_something'

    def test_enter_promotion(self):
        @patch.object(my_app.models.FooClass, 'bar')
        def fake_bar(self, mock_my_method):
            print "Do something I want!"
            return True

        self.client.get(reverse(view))

Neyi yanlış yapıyorum?


baraslında bir "örnek metodu" ve tek parametresi self. Bir sınıf yöntemi olmak için, ile parametreleştirilmesi gerekir clsve olarak çağrılabilir olmalıdır Promotion.foo().
cavaunpeu

Patchable nesneden şu şekilde alıntı yapılmalıdır: @patch.object('my_app.models.FooClass', 'bar')
Lasma

2
@cavaunpeu - değil (sadece) ile parametreli cls(çünkü daha da önemlisi, ancak selfve clspiton değil ortalama şey special yapmak), süslenmiş@classmethod
dwanderson

Yanıtlar:


69

Kit'in cevabına eklemek için patch.object(), alay edilen nesnenin / yöntemin belirtilmesine izin vermek için 3. bir bağımsız değişken belirtmek . Aksi takdirde, varsayılan bir MagicMocknesne kullanılır.

    def fake_bar(self):
        print "Do something I want!"
        return True

    @patch.object(my_app.models.FooClass, 'bar', fake_bar)
    def test_enter_promotion(self):
        self.client.get(reverse(view))
        # Do something I want!

Not Alay nesneyi belirtirseniz, varsayılan, yani MagicMock()edilir artık yamalı nesne geçti - örneğin artık:

def test_enter_promotion(self, mock_method):

ama velakin:

def test_enter_promotion(self):

http://www.voidspace.org.uk/python/mock/patch.html#patch-object


Ben bu uygulamayı tercih ediyorum. Özellikle Unit Testing'e yeni başlayanlar için daha nettir.
Dorcioman

36

Ah, o yama dekoratörünü nereye uygulayacağım konusunda kafam karışmıştı. Sabit:

class ViewsDoSomething(TestCase):
    view = 'my_app.views.do_something'

    @patch.object(my_app.models.FooClass, 'bar')
    def test_enter_promotion(self, mock_method):
        self.client.get(reverse(view))

21
Alay etme yöntemi ile sahte uygulama arasındaki bağlantıyı şimdi nerede kuruyorsunuz?
fiziksel

@physicalattraction, bağlantı mock_methodtest işlevine iletilen argüman tarafından yapılır . Bu tekniği testlerimden birinde kullanabildim. Bu, yalnızca alay edilen yöntemin çağrılıp çağrılmadığını doğrulamak istediğinizde kullanışlıdır.
Kalyan Vedala

@ rcode74: Test yöntemi içindeki bir (başka bir nesnenin) örneğinin bir yöntemine yama nasıl yapılır. örneğin: def my_method_to_be_tested (...): r = bazı_seçenek.some_class (...); r.how_to_patch_this_method.
imsrgadich

1
@imsrgadich, r.how_to_patch_this_method = MagicMock () gibi bir şey yaparsınız. Sahte nesneye nasıl davranış atayacağınızı öğrenmek için MagicMock belgelerine bakabilirsiniz.
Kalyan Vedala
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.