5

テスト スイート (unittest ではなく、nose を使用) があり、関数にパッチを適用して、テスト クラスのすべてのテストに対して特定のシーケンスの値を返したいと考えています。簡単な例を使用した私の最初の試みは次のとおりです。

@patch('time.clock', MagicMock(side_effects=[1, 2]))
class Tests:
    def test_1(self):
        assert time.clock() == 1
        assert time.clock() == 2

    def test_2(self):
        assert time.clock() == 1
        assert time.clock() == 2

ただし、MagicMock インスタンスは 1 回しか作成されないため、副作用がなくなると 2 番目のテストは失敗します。各テスト メソッドに個別にパッチを適用することはできますが、パッチ デコレータをすべてのメソッドに複製したくはありません (この例よりもはるかに多くのテストがあります!)次のようなセットアップコード:

class Tests:
    def setup(self):
        self.old_clock = time.clock
        time.clock = MagicMock(side_effects=[1, 2])

    def teardown(self):
        time.clock = self.old_clock

    def test_1(self):
        assert time.clock() == 1
        assert time.clock() == 2

    def test_2(self):
        assert time.clock() == 1
        assert time.clock() == 2

しかし、元の関数定義の保存と復元は、Mock が自動的に実行できるように思えます。私が見逃しているこれを行う別の方法はありますか?または、私の最後の例はこれを行うための最良の方法ですか?

4

2 に答える 2

1

クラスにパッチを適用するのではなく、すべてのテストにパッチを適用する必要があります。

class Tests:
    @patch('time.clock', MagicMock(side_effects=[1, 2]))
    def test_1(self):
        assert time.clock() == 1
        assert time.clock() == 2

    @patch('time.clock', MagicMock(side_effects=[1, 2]))
    def test_2(self):
        assert time.clock() == 1
        assert time.clock() == 2
于 2013-11-05T08:50:41.410 に答える