对 mock.sentinel 个对象的操作

Operations on mock.sentinel objects

我真的很喜欢mock的哨兵价值观。在您只想编写覆盖一行的最小单元测试的情况下,不使用随机无意义数字是一种好方法。

但是,以下

from mock import sentinel, patch

def test_multiply_stuff():
    with patch('module.data_source1',return_value=sentinel.source1):
        with patch('module.data_source1',return_value=sentinel.source1):
            assert function(module.data_source1,
                            module_data2) == sentinel.source1 * sentinel.source2

不起作用。你会得到

TypeError: unsupported operand type(s) for *: '_SentinelObject' and '_SentinelObject'

我理解原因:哨兵对象上的操作不能计算为表达式是有道理的。

是否有某种技术可以做到这一点(最好在 mock 内)?

我可以使用一些技巧吗?或者你能做的最好的事情就是使用模范数字?

也许最简单的方法是使用 id(sentinel_object) 而不是哨兵本身:

from mock import sentinel, patch

def test_multiply_stuff():
    with patch('module.data_source1',return_value=sentinel.source1):
        with patch('module.data_source2',return_value=sentinel.source2):
            assert function(id(module.data_source1), id(module.data_source2) == id(sentinel.source1) * id(sentinel.source2)