1

実行時に get_account(param1,param2) という関数があるので、この関数を関数 mock_get_account(param1,param2) に置き換える必要があるため、システムが get_account(param1,param2) を呼び出すときは mock_get_account(param1,param2) が必要です代わりに呼び出されます。

私はこのコードを試しました: package.get_account=self.mock_get_account package.get_account(x,y) しかし、mock_get_account の代わりに get_account が実行されます。Python は初めてで、これが可能かどうかはわかりませんが、ラムダ関数と私はPythonで関数プログラミングが可能であることを知っています. ありがとう編集:私が次のことをした場合:

package.get_account=self.mock_get_account 
package.get_account(x,y) 

その後、すべて問題ありません。つまり、mock_get_account が呼び出されますが、mu コードでは、次のコードで、package.get_account をトリガーするポスト self.client.post(url, data=data, follow=True) を実行しますが、これはそうではありません働く:

package.get_account=self.mock_get_account 
 package.get_account(x,y) 
 #the folowing call will trigger the package.get_account(x,y) function in a django url        #callback
 self.client.post(url, data=data, follow=True)

古い関数を呼び出すことを意味し、 get_account(param1,param2) はファイル側で定義され、クラスの子関数ではなく、 mock_get_account(self,param1,param2) はクラス Test で定義され、内部で呼び出されますTest.test_account - 関数

4

2 に答える 2

0

これは非常に意見が分かれており、質問に(直接)答えることはありませんが、問題が解決することを願っています。

mock_get_accountより良い方法は、以下の例のように、親get_accountメソッドをオーバーライドする の実装でサブクラスを使用することです。

class A(object):

    def get_account(self):
        return 1

    def post(self):
        return self.get_account()

class B(A):

    def get_account(self):
        return 2  # your original mock_get_account implementation

a = A()
print(a.get_account())

b = B()
print(b.post())  # this .post will trigger the overridden implementation of get_account
于 2013-07-22T14:16:34.970 に答える
0

私の推測では、実装するコードは、のような import ステートメントを介しself.client.postてアクセスできます。get_accountfrom package import get_account

from package import get_accountpackageまだインポートされていない場合は、最初にロードされます。次に、そのモジュールで名前を探し、get_accountバインドされたオブジェクトはすべて、インポートするパッケージの名前空間にバインドされますget_account。その後、2 つの名前は同じオブジェクトを参照しますが、同じ名前ではありません。

したがって、この時点の後にモック コードが登場すると、代わりに参照するように名前get_accountが設定されます。しかし、それは再び読み取るコードにのみ影響します。その名前で既にインポートされているものは特に影響を受けません。packagemock_get_accountget_accountpackage

コード ビハインドが代わりにthroughにself.client.postしかアクセスできず、それを呼び出していた場合、インポート モジュールの名前空間にバインドされているモジュールを表すオブジェクトのみであるため、機能します。そのオブジェクトの属性を読み取るため、現在の値が何であれ取得されます。がモジュール スコープではなく関数ローカル スコープにある場合、これは同様に動作します。packageimport packagepackage.get_accountpackagepackage.get_accountfrom package import get_account

私が正しく、コードがこのように構成されている場合、残念ながら実際package.get_accountにはモックに再バインドする必要はありませんが、元get_accountのモジュールの名前self.client.post(およびそれを呼び出す可能性のある他のモジュール)。

于 2013-07-23T00:40:05.177 に答える