5

単体テストの分離を実際に開始して、何か問題が発生したときに画面全体が失敗して赤くなるのではなく、エラーが発生した場所を特定できるようにしました。イニシャライザで何かが失敗した場合を除いて、すべてのインスタンスで機能しています。

これらのテストをチェックしてください:

@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)

イニシャライザまたはオブジェクト コンストラクタを分離またはモックする方法はありますか?

4

2 に答える 2

1

どのテスト パッケージを使用しているかはわかりませんが、通常は、__init__()実際に使用する前にクラスの呼び出しをモックすることができます。何かのようなもの

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

SomeFiles.__init__ = my_init_mock_fn
SomeFiles()

この時点からSomeFiles.__init__fn は常にモック fn になるため、これはおそらくあなたが望むものではありませんが、特定のスコープのためだけにクラスにパッチを適用できるようにするパッチ関数を提供するvoidspace モックのようなユーティリティがあります。

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_with た。ここにページがあります。

于 2013-10-29T21:00:02.167 に答える