我有困難的測試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