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) 但仍然运行 get_account 而不是 mock_get_account 我是 python 新手,我不知道这是否可能,但我见过lamda 函数,我知道函数编程在 python 中是可能的。谢谢编辑:如果我执行以下操作:

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

然后一切正常,这意味着调用了 mock_get_account,但是在 mu 代码中,我下面的代码我做了一个 post self.client.post(url, data=data, follow=True) 触发 package.get_account 这不是在职的:

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

我的猜测是代码实现self.client.post可以get_account通过一个看起来像from package import get_account.

from package import get_accountpackage如果尚未导入,将首先加载。然后它将get_account在该模块中查找名称,并且绑定到的任何对象都将绑定在导入包的名称空间中,也在名称下get_account。此后,这两个名称指的是同一个对象,但它们不是同一个名称。

因此,如果您的模拟代码出现此之后,它会将名称设置get_accountpackage引用mock_get_account. 但这只会影响再次读取get_account的代码package;任何已经特别导入该名称的东西都不会受到影响。

如果后面的代码self.client.post只能访问packagethroughimport package并且正在调用package.get_account它,那么它将起作用,因为只有表示package模块的对象才绑定在导入模块的命名空间中。package.get_account将读取该对象的属性,因此将获得当前值。如果from package import get_account出现在函数本地范围而不是模块范围,那么它的行为将类似。

如果我是正确的并且你的代码是这样构造的,那么不幸的是package.get_account你并不需要重新绑定到一个模拟,而是get_account模块中的self.client.post名称来自哪里(以及任何其他可能调用它的模块)。

于 2013-07-23T00:40:05.177 回答