4

我有一个行为像这样的实用程序方法

def my_patch_method(self):
    pass

def patch_my_lib():
    from mylib import MyClass
    MyClass.target_method = my_patch_method
    return MyClass()

此测试失败:

self.assertEqual(my_patch_method, patch_my_lib().target_method)

而这个有效:

self.assertEqual(my_patch_method.__name__, patch_my_lib().target_method.__name__)

由于补丁方法没有相同的名称,这仍然是可以接受的证明,它patch_my_lib()正在做它付出的代价,但为什么第一个没有像我预期的那样工作?而且,有没有办法“修复”它?

4

4 回答 4

3

您的第一个测试失败的原因是,一旦您将函数修补到您的类中,它就不再是同一个对象了。

>>> def foo(self): pass
... 
>>> class Foo: pass
... 
>>> Foo.bar = foo
>>> type(Foo.bar)
<type 'instancemethod'>
>>> type(foo)
<type 'function'>
>>> 
>>> Foo.bar is foo
False
>>> Foo.bar == foo
False

事实上,原来的函数和新的方法有不同的类型。相反,让您的第一个测试检查这种情况:

>>> Foo.bar.im_func is foo
True

所以也许是这样:self.assertIs(my_patch_method, patch_my_lib().target_method.im_func)

于 2012-10-10T15:05:49.910 回答
2

尝试:

self.assertEqual(my_patch_method, patch_my_lib().target_method.im_func)
于 2012-10-10T15:05:06.530 回答
1

您正在从 patch_my_lib 返回一个实例,因此将该函数与绑定方法进行比较

这样的事情应该通过

self.assertEqual(my_patch_method, patch_my_lib().target_method.im_func)

但最好检查您正在修补的行为是否正常工作

于 2012-10-10T15:01:08.823 回答
0

MyClass.target_method = my_patch_method将您的函数设置为 的类函数MyClass,但您使用 . 返回该类的实例return MyClass()

于 2012-10-10T15:02:26.070 回答