2017-12-07 5 views
-1

私はmain関数で構築されたクラスをスタブアウトして、mainに対してテストを行い、クラスが特定のデータで初期化されることを宣言しました。しかし、主な機能は依然として嘲笑されたインスタンスを拾わない。どのように私は嘲笑されたインスタンスに沿ってメインに渡すことができます。pythonのmainメソッドへの魔法の擬似参照を渡す方法

from unittest.mock import patch 
from contextlib import contextmanager 

@contextmanager 
def use_mocked(method, cls, ret_value): 

class MockedClass(cls): 
    pass 

def func(cls): 
    return ret_value 

def fullname(o): 
    return o.__module__ + "." + o.__name__ 

setattr(MockedClass, method, classmethod(func)) 

with patch(fullname(cls), MockedClass): 
    yield 

これは、メインが擬似参照を渡されていることを確認するためのパッチユーティリティです。私はその機能の仕方について私の理解に混乱するかもしれません。メインモジュールで

def test_main(): 
    magic_b = MagicMock(spec_set=Benchmark, wraps=Benchmark) 
    with use_mocked("__new__", DataStream, magic_b): 
     main.main() 
     magic_b.assert_called_once_with() # fails 

、Iのように定義mainメソッドを持っている...

import benchmark.Benchmark 
def main(): 
    b = benchmark.Benchmark() # <- this is not the mocked instance 
    ... 

答えて

0

Iはunittest.mockに同じパッチユーティリティに依存していたが、代わりに、単にの形でそれを使用し私のテストの周りのデコレータ。 patch()は、メインインポートであるBenchmarkクラスで渡されます(ベンチマークモジュールではなく、自己でパッチを適用することが重要です。つまりベンチマークパッチを適用しないでください.Benchmark)。メインモジュールはそのまま残り、テストは終了します。

import main 

@patch("main.Benchmark") 
# b here is a ref to MagicMock class mocking Benchmark; 
# it is substituted into the execution of main module, 
# patch provides it as a param so you can assert against it. 
def test_main(b): 
    main.main() 
    b.assert_called_once_with() 
関連する問題