簡體   English   中英

使用pytest使用奇怪的語法測試裝飾器

[英]testing decorator with pytest using weird syntax

所以我想測試一個裝飾器,該裝飾器可以為您提供已預塗的協程(因此,我不必做coroutine.send(None) )。

詳細信息可以在這里找到。 大衛·比茲利(David Beazley)的例子)

所以在conftest.py中,我創建了一個函數包裝器,該包裝器是pytest固定裝置,如果可以的話,可以給我一個原始的協程。

我這樣做的原因是因為pytest在yield關鍵字后將任何東西都用作拆卸代碼,但我不希望這樣做。 所以我自己包裝了一個原始的協程。

@pytest.fixture(scope="module")
def create_coroutine_func():

    def grep(pattern):
        print "Looking for %s" % pattern
        while True:
            line = (yield)
            if pattern in line:
                print line
    return grep

現在在我的測試文件中,我有一個相當簡單的測試:

    from something.decorators import *
    import pytest

1    def test_coroutine(create_coroutine_func):
2        coro_func = create_coroutine_func()
3        coro_wrapper = coroutine(coro_func)
4    
5        assert callable(coro_wrapper)

好的,就是這樣。 pytest抱怨:

create_coroutine()缺少1個必需的位置參數:“模式”

然后我繼續編輯第2行:

coro_func = create_coroutine_func("python") # match anything has 'python' in it.

現在測試通過了。

現在,我現在對裝飾感到有些困惑。

因此,在我的示例中,grep接受了一個參數; 當我調用grep函數包裝器時,我也需要給函數包裝器一個參數,盡管它本身不需要任何參數? 這是裝飾器的工作方式嗎?

UPD:正如@ jacques-kvam在注釋中指出的那樣,當您將夾具作為參數傳遞給測試函數時,夾具的返回值就是參數的值。 因此,在您的情況下,第2行create_coroutine_funcgrep

pytest固定裝置的這種誤解可能是濫用測試函數本身中的值的主要原因。

一旦清楚了,這就是我的原始答案:


在這里,您可以在create_coroutine_func()第2行調用函數。 這就是為什么它期望參數被傳遞的原因。

如果要將功能包裝到裝飾器中,實際上需要對功能對象本身進行操作。 它不調用它,而是將其作為值傳遞給裝飾器:

def test_coroutine(create_coroutine_func):
    coro_wrapper = coroutine(create_coroutine_func)
    assert callable(coro_wrapper)
    coro_wrapper("python")

裝飾器就是這樣工作的:它們將一個函數作為參數,然后返回另一個(或相同)函數作為結果。


PS:可以使用更漂亮的語法編寫該測試:

from something.decorators import *
import pytest

def test_coroutine(create_coroutine_func):

    @coroutine
    def grep(pattern):
        print "Looking for %s" % pattern
        while True:
            line = (yield)
            if pattern in line:
                print line       

    assert callable(grep)
    grep("python")

請注意,裝飾器的用法在測試內部。 因此,如果發生任何錯誤,測試將正常失敗,而不是pytest的模塊導入(因為如果在模塊級別上聲明了修飾的函數(您可能已經注意到)會發生這種情況)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM