2016-06-21 17 views
6

私はユニットテストでユーティリティクラス(この場合はPythonロガーユーティリティ)を模擬しようとしています。pytestを使った単体テストの "setup"メソッドでmonkeypatchを使う方法は?

私は、テストレベルごとにmonkeypatchを使ってそれを行う方法を知っていましたが、私はセットアップの一部として/それを何らかの方法でグローバルに行うことができればと思っていました。ここで

は私が行うことができます期待しています(しかし、私はエラーを取得しています)です:

import logging 

... 

def setup(self, monkeypatch): 

    class fake_logger(level): 
        def __init__(self, val): 
            pass 

        def setLevel(self, level): 
            # Do something 

    def mock_logger(level): 
        return fake_logger(level) 
    monkeypatch.setattr(logging, 'getLogger', mock_logger) 

これを行うための正しい方法は何ですか?

EDIT:正常pytest具として機能monkeypatch例エラー

name = 'setup' 

def call_optional(obj, name): 
    method = getattr(obj, name, None) 
    isfixture = hasattr(method, "_pytestfixturefunction") 
    if method is not None and not isfixture and py.builtin.callable(method): 
     # If there's any problems allow the exception to raise rather than 
     # silently ignoring them 
>   method() 
E   TypeError: setup() missing 1 required positional argument: 'monkeypatch' 
+0

ご迷惑をおかけください。間違っていることを理解するのに役立ちます。 –

答えて

3

。それを使用したい場合は、メソッドをフィクスチャーとして作成する必要があります。

import logging 

import pytest 


@pytest.fixture 
def setup(monkeypatch): 

    class fake_logger(object): 
     def __init__(self, val): 
      pass 

     def setLevel(self, level): 
      # Do something 
      pass 

    def mock_logger(level): 
     return fake_logger(level) 
    monkeypatch.setattr(logging, 'getLogger', mock_logger) 

def test_fake_logger(setup): 
    # test steps 

、あなたがテストでlogging.getLogger('any level')の種類を確認した場合、それはあなたが定義したfake_loggerになります。

+0

'@ pytest.fixture(autouse = True)'を実行することもできるので、 'setup'引数を持たなくても自動的にすべてのテストに適用されます。 –

関連する問題