有没有一种方法可以模拟type()的返回,而不用替换为isinstance()



我正试图对一块代码进行单元测试,但在嘲笑对象的类型以从字典中获取正确的函数时遇到了问题。

例如:

my_func_dict = {
Foo: foo_func,
Bar: bar_func
FooBar: foobar_func
}
def generic_type_func(my_obj):
my_func = my_func_dict[type(my_obj)]
my_func()

有了这段代码,我可以通过关键字查找在函数之间进行交换,而且效率很高。

当我试着这样模拟my_obj时,我会得到一个KeyError:

mock_obj = Mock(spec=Foo)
generic_type_func(mock_obj)
# OUTPUT:
# KeyError: <class 'unittest.mock.Mock'>

因为这是一个模拟类型。尽管,当我检查isistance((时,它返回true:

is_instance_Foo = isinstance(mock_obj, Foo)
print(is_instance_foo)
# Output: 
# True

是否有任何方法可以保留type((检查,并通过键使用字典查找,同时仍然保持模拟input和return_type的能力?或者可能是一种不同的模式,我可以保留字典的性能,但使用isinstance((,这样我就可以模拟参数了?在列表上循环以根据每个可能的值检查类型是不可取的。

我通过将函数移动到参数本身,并从父级隐式调用函数,成功地对其进行了单元测试。我想避免这种情况,因为现在函数隐式地操纵父级,而不是从父级本身显式地操纵。现在看起来是这样的:

def generic_type_func(self, my_obj):
my_obj.my_func(self)

然后,函数根据需要修改self,但要隐式修改,而不是父类上的显式函数。

此:

def my_func(self, parent):
self.foo_prop = parent

而不是:

def my_foo_func(self, foo):
foo.foo_prop = self

这可以很好地与mock配合使用,而且我可以很容易地模拟该函数。我只是隐藏了一些功能,并隐式地编辑父类上的属性,而不是从我正在处理的类中显式地编辑。也许无论如何,这是更可取的,而且父类上代码更少,看起来更干净。每个实例都必须以这种方式拥有my_func,这是通过抽象基类强制实现的。

最新更新