如何指定unittest.mock.sentinel的类型?

时间:2018-11-12 09:46:04

标签: python-3.x unit-testing

我正在使用unittest.mock.sentinel为测试函数提供哑数值,然后断言调用。

我希望能够指定哨兵的类型,以便其通过方法中的类型检查。

MWE:

import collections
from unittest.mock import sentinel

def fun(x):
    if not isinstance(x, collections.Iterable):
        raise TypeError('x should be iterable')
    pass

def test_fun_pass_if_x_is_instance_iterable():
# this does not work and raise because sentinel is not iterable
    assert fun(sentinel.x) is None

编辑

我尝试做sentinel.x = collections.Iterable(),但收到错误消息:

TypeError: Can't instantiate abstract class Iterable with abstract methods __iter__

例如,到目前为止我可以做sentinel.x = tuple()sentinel.x = list(),但这是可迭代的特殊情况

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是collections.Iterable是一个抽象基类(ABC),不能直接实例化。这就是错误消息的含义,方法__iter__是抽象的,没有主体。您必须使用派生类或自己编写一个类。