2013-10-18 13 views
5

私は実際にユニットテストを分離しようとしましたが、1つのことがうまくいかなかったときに画面全体が赤く点灯するのではなく、イニシャライザ内の何かが失敗した場合を除いて、すべてのインスタンスで動作しています。イニシャライザに依存するテストを分離する良い方法

は、これらのテストをチェックアウト:私がテストしてる事は完全に分離されるように

@setup_directory(test_path) 
def test_filename(self): 
    flexmock(lib.utility.time).should_receive('timestamp_with_random').and_return(1234) 

    f = SomeFiles(self.test_path) 
    assert f.path == os.path.join(self.test_path, '1234.db') 

@setup_directory(test_path) 
def test_filename_with_suffix(self): 
    flexmock(lib.utility.time).should_receive('timestamp_with_random').and_return(1234) 

    f = SomeFiles(self.test_path, suffix='.txt') 
    assert f.path == os.path.join(self.test_path, '1234.txt') 

は私が依存メソッドをからかっています。あなたが気づくのは、すべての単一のテストのためにクラスをインスタンス化する必要があるということです。 イニシャライザでエラーが発生した場合は、すべてのテストが失敗します。

これは、クラスの初期化子を呼び出す問題のコンストラクタです:

SomeFiles(*args) 

は、初期化子またはオブジェクトのコンストラクタを隔離または模擬する方法はありますか?

答えて

1

使用しているテストパッケージがわかりませんが、一般的には実際に使用しようとする前に__init__()コールをモックするだけです。

def my_init_mock_fn(*args, **kwargs): 
    print 'mock_init' 

SomeFiles.__init__ = my_init_mock_fn 
SomeFiles() 

ような何かがこれはおそらく、まさにあなたが常にモックFNなりますSomeFiles.__init__ FN上のこの時点からと望むものではありませんが、クラスにパッチを適用できるようにするパッチ機能を提供voidspace mockなどのユーティリティがあります特定の範囲のためだけです。

from mock import patch 
with patch.object(SomeFiles, '__init__', my_init_mock_fn): 
    SomeFiles() 
    ..other various tests... 
SomeFiles() #__init__ is reset to original __init__ fn 

あなたが使用しているどんなモッキングパッケージでもおそらく同様の機能があると確信しています。ちょうどあなたがflexmockを使用している実現

は、ページがreplace_withhere.

+0

モック\ _ \ _ init__。今私はそれについて考えているとき、簡単な答えのようです:)私はこのflexmock(SomeFiles)を行うためにflexmockを使用しました.should_receive( '\ _ \ _ init__') –

0

初期化機能が失敗する原因は何ですか?たぶんそれはあなたが探しているはずのバグでしょう。

オブジェクトコンストラクタを嘲笑するのではなく、もう1つのことは、単純に戻り値を嘲笑することです。つまり、この入力が与えられると、私はこの出力を期待しています - したがって、正しく出力されたかどうかにかかわらず、この出力を使用します。

最初の失敗時にテストを停止することもできます。 (failfast

また、テストの設定方法を再検討することもできます。テストごとに2つのファイルを再作成する必要がある場合は、おそらく自分自身に質問してください。 2つのファイルを設定し、一連のテストを実行し、すすぎ、繰り返しを実行するようにテストを構成することができますか?これにより、そのパスに割り当てられた一連のテストだけが失敗し、失敗した理由を特定するのに役立ちます。

+0

のためにありますいいえ、私はコンストラクタを持つ特定のバグについて尋ねていませんよ。テストスイートで\ _ \ _ init \ _ \ _メソッドを分離する方法を尋ねています。 2つのテスト例ではイニシャライザがテストされていませんが、イニシャライザにバグがあると失敗します。基本的にイニシャライザを模擬したテストを書くことができるので、テストを分離することができます。 –

関連する問題