簡體   English   中英

為什么這個模擬腳本不起作用(unittest,Mocker,python)

[英]Why this mocking script doesn't work (unittest, Mocker, python)

我想模擬使用以下腳本在MyClass.mymethod中調用的MyClass.toBeMockedMethod。 它運行時並沒有實際對其進行嘲笑。 不知道為什么。

class Test_mytest(MockerTestCase): 

   def mock_it_up(self, function, result=None, mmin=0, mmax=None):
      function = self.m.mock()
      function(ARGS)
      self.m.result(result)
      self.m.count(mmin, mmax)

   def setUp(self):
      self.m = Mocker()

      self.mock_it_up(MyClass.toBeMockedMethod)

      self.o=Myclass(0)


   def test_one_atom(self):
      self.o.mymethod()


   def tearDown(self):
      pass

if __name__ == '__main__': 
   main()

就像這個問題一樣 ,您真正想做的是修補 MyClass實例。 如果MyClass新樣式的類,則可以執行以下操作:

class Test_mytest(MockerTestCase):

    def mock_it_up(self, function, result = None, mmin = 0, mmax = None):
        methodToMock = getattr(self.p, function)
        methodToMock()
        self.m.result(result)
        self.m.count(mmin, mmax)

    def setUp(self):
        self.m = Mocker()
        self.o = MyClass(0)
        self.p = self.m.patch(self.o)
        self.mock_it_up('toBeMockedMethod')
        # Put more calls to mock_it_up here.
        self.m.replay()

    def test_one_atom(self):
        self.o.mymethod()

這將修改self.o以便對toBeMockedMethod調用進行toBeMockedMethod

但是,如果MyClass不是新型類,則修補將無法進行。 在這種情況下,您可以使用類型模擬來誘使MyClass進行所需的操作。 例如:

class Test_mytest(MockerTestCase):

    def mock_it_up(self, function, result = None, mmin = 0, mmax = None):
        methodToMock = getattr(self.mockObj, function)
        methodToMock()
        self.m.result(result)
        self.m.count(mmin, mmax)

    def setUp(self):
        self.m = Mocker()
        self.o = MyClass(0)
        self.mockObj = self.m.mock(MyClass)
        self.mock_it_up('toBeMockedMethod')
        # Put more calls to mock_it_up here.
        self.m.replay()

    def test_one_atom(self):
        MyClass.mymethod(self.mockObj)

請注意,該mockmock方法與要進行類型模擬的類一起調用。 后來,我們調用MyClass.mymethod(...)而不是調用self.o.mymethod() MyClass.mymethod(...) 現在, MyClass.mymethod()期望將MyClass的實例作為其第一個參數,但是幸運的是,模擬對象偽裝成MyClass的實例,因此調用得以進行。 mymethod()調用toBeMockedMethod() ,它將實際上調用toBeMockedMethod()方法,而不是實際方法。

我迅速修改了一個測試MyClass如下所示:

class MyClass():
    def __init__(self, x):
        self.x = x

    def toBeMockedMethod(self):
        print "Not Mocked!"

    def mymethod(self):
        self.toBeMockedMethod()

當我將此代碼作為單元測試運行時,我得到了:

.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK

這是理想的結果。

暫無
暫無

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

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