簡體   English   中英

使用模擬補丁模擬實例方法

[英]Using mock patch to mock an instance method

我試圖在使用富有想象力的名稱Mock testing library測試 Django 應用程序時模擬某些東西。 我似乎無法讓它正常工作,我正在嘗試這樣做:

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))

我究竟做錯了什么?

為了增加Kit的答案,在patch.object()指定第3個參數可以指定patch.object()對象/方法。 否則,將使用默認的MagicMock對象。

    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!

請注意,如果指定了MagicMock()對象,則默認的MagicMock() 不再傳遞到修補的對象中-例如,不再:

def test_enter_promotion(self, mock_method):

但反而:

def test_enter_promotion(self):

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

啊,我對在哪里應用該補丁裝飾程序感到困惑。 固定:

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))

如果您想對assert_called方法執行assert_called等,請使用patch.object並將替換方法包裝在MagicMock(side_effect=) ,即:

with patch.object(class_to_mock, attribute_name, \
 MagicMock(side_effect=replacement_method)) as replacement_method_mock:

例如。:

from unittest.mock import patch, MagicMock

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

def test_enter_promotion(self):
    with patch.object(my_app.models.FooClass, 'bar', MagicMock(side_effect=fake_bar)) as fake_bar_mock:
        self.client.get(reverse(view))
        # Do something I want!
        fake_bar_mock.assert_called()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM