我有困难的测试Python函数的返回 可迭代的,就像是函数返回迭代 屈服或简单地返回一个迭代,就像return imap(f, some_iter)
或return permutations([1,2,3])
功能。测试功能在Python
因此,对于排列示例,我期望函数的输出为[(1, 2, 3), (1, 3, 2), ...]
。所以,我开始测试我的代码。
def perm3():
return permutations([1,2,3])
# Lets ignore test framework and such details
def test_perm3():
assertEqual(perm3(), [(1, 2, 3), (1, 3, 2), ...])
这是行不通的,因为perm3()
是一个迭代,而不是 列表。所以我们可以修复这个特殊的例子。
def test_perm3():
assertEqual(list(perm3()), [(1, 2, 3), (1, 3, 2), ...])
这工作正常。但是如果我有嵌套迭代器呢?这是 iterables产生iterables?就像表达式 product(permutations([1, 2]), permutations([3, 4]))
一样。现在这是 可能没有用,但很明显,它将是(一旦展开 迭代器),如[((1, 2), (3, 4)), ((1, 2), (4, 3)), ...]
。 但是,我们不能只围绕我们的结果包裹list
,因为只有 将iterable<blah>
转换为[iterable<blah>, iterable<blah>, ...]
。那么当然 我可以做map(list, product(...))
,但只针对2
所以一个 嵌套级别的作品,并蟒蛇测试社区有对 问题的任何解决方案测试iterables什么时候?当然,有些iterables不能以这种方式进行测试,就像你想要一个无限生成器一样,但是 这个问题应该足够普遍,以至于有人想到 。
我会接受这个,因为它和dbw的答案一样好。与我的答案不同,你可以混合使用'tuples' /'lists'。这个答案也只是复制粘贴可运行。 :)但是! (1)实际检查它是否返回一个可迭代的(将'return permutations([1,2,3])'''返回给'return list(permutations([1,2,3]),我会更满意。 ]))'不应该传递**和**(2)嵌套的期望值应该有正确的类型,这就是将其中一个元组更改为不应该传递的列表(将'(2,3,1)'更改为' [2,3,1]')。 – Tarrasch
啊,很公平,我想我通常会避免测试类型,并尝试测试接口,这样可以在某些方面改变实现细节,同时继续生成相同的数据/结果 – dbn