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.