2017-02-07 11 views
0

テストのためだけに引数を__init__に公開するテスト対象のクラスがあります。私のテストでこのunittestの__init__メソッドのデフォルト引数を置き換える方法

class MyClass(object): 
    def __init__(self, start_time=None): 
    if start_time is None: 
     start_time = time.time() 

が、私は偽の時間を使ってのstart_timeに渡したいように見えますので、私はsetUp()最初の時間を取得し、すべてのテストメソッドに渡します。

class MyclassTest(TestCase): 
    def setUp(self): 
    self.fake_start_time = time.time() 

    def test_one(self): 
    x = MyClass(start_time=self.fake_start_time) 
    ... 

    def test_two(self): 
    x = MyClass(start_time=self.fake_start_time) 
    ... 

このすべてが動作しますが、私はすべての単一のテストでstart_time=self.fake_start_timeを書かないようにするための方法があります場合、私は思ったんだけど。どういうわけか__init__メソッドのデフォルト引数をsetUp()に置き換えることはできますか?

私は醜い方法を考え出しましたが、より標準的なアプローチがあるかどうか疑問に思っていました。おそらくmock.patchに基づいていますか?

答えて

1

setUpにクラスのインスタンスを作成します。

def setUp(self) 
    self.fake_start_time = time.time() 
    self.x = MyClass(start_time=self.fake_start_time) 
1

functools.partialは引数-バインド事前に使用することができます。したがって、この場合には、クラスのコンストラクタに時間を結合することができ、その後、追加の引数を渡さずにバインドされたコンストラクタを使用します。

from functools import partial 

class MyclassTest(TestCase): 
    def setUp(self): 
    # Feel free to use a shorter name 
    self.FakeTimeMyClass = partial(MyClass, time.time()) 

    def test_one(self): 
    x = self.FakeTimeMyClass() 
    ... 

    def test_two(self): 
    x = self.FakeTimeMyClass() 
    ... 
+0

私の解決策とは異なり、それはインスタンス化にあたり、テストの引数を追加することができますので、これはクールです。ニース! – ErlVolton

関連する問題