14

私は C# 開発者で、いくつかの Python に移行しているので、まだ何をしているのかわかりません。Python での依存性注入は実際には必要ないことを読みました。コード内でオブジェクトをインスタンス化して、好きなように実行できると言われましたが、これらのオブジェクトのメソッドを、私のテストで定義された独自のスタブ (おそらくモックなし) に向けることができます。

これは本当ですか?私はそれをやろうとしましたが、うまく機能させることができません。これは実際にどのように行われますか?モック ライブラリを使用せずに Python でメソッドをスタブするにはどうすればよいですか?

4

2 に答える 2

35

これが基本的な例です。製品の getData() メソッドは呼び出されないことに注意してください。スタブで嘲笑されています。

import unittest
class ClassIWantToTest(object):

    def getData(self):
        print "PRODUCTION getData called"
        return "Production code that gets data from server or data file"

    def getDataLength(self):
        return len(self.getData())

class TestClassIWantToTest(unittest.TestCase):

    def testGetDataLength(self):
        def mockGetData(self):
            print "MOCK getData called"
            return "1234"

        origGetData = ClassIWantToTest.getData
        try:
            ClassIWantToTest.getData = mockGetData
            myObj = ClassIWantToTest()
            self.assertEqual(4, myObj.getDataLength())
        finally:
            ClassIWantToTest.getData = origGetData

if __name__ == "__main__":
    unittest.main()
于 2010-10-11T22:47:00.290 に答える
3

Python 関数はファースト クラスのオブジェクトであるため、任意の関数を識別子に割り当てることができます。

class Person:
  def greetings(self):
    return "Hi!"

def happy_greetings(self):
  return "Hi! You're awesome!"

mike = Person()
mike.greetings()  # "Hi!"

Person.greetings = happy_greetings
mike.greetings()  # "Hi! You're awesome!"

メソッド識別子は、関数への参照と考えてください。参照を変更することにより、Python インタープリターは参照先を見つけて実行します。ただし、これを手動で行う代わりに、unittest.mockなどの成熟したモジュールを使用することをお勧めします。これは、スタブ スコープの管理などのような落とし穴がたくさんあるためです。

于 2020-07-03T18:23:03.523 に答える