41

MockMixinテスト用に何らかのものを作成する必要があります。外部ソースを呼び出すすべてのモックを含める必要があります。たとえば、管理パネルでモデルを保存するたびに、いくつかのリモート URL を呼び出します。それを嘲笑して、そのように使用するのは良いことです:

class ExampleTestCase(MockedTestCase):
    # tests

したがって、機能テストなどでモデルを管理者に保存するたびに、リモート URL を呼び出す代わりに、このモックが適用されます。

それは実際に可能ですか?私は 1 つの特定のテストでそれを行うことができますが、それは問題ではありません。しかし、私はそれをよく使うので、いくつかのグローバル モックがあるとより便利です。

4

3 に答える 3

56

mockドキュメントによると:

Patch は TestCase クラスのデコレーターとして使用できます。クラス内の各テストメソッドを装飾することで機能します。これにより、テスト メソッドが共通のパッチ セットを共有する場合に定型コードが削減されます。

@patchこれは基本的に、内部のすべてのテスト メソッドが実行されている間に外部呼び出しをモックする、デコレータが適用された基本テスト クラスを作成できることを意味します。

また、およびメソッドでstart()およびstop()パッチャーのメソッドをそれぞれ使用できます。setUp()tearDown()

class BaseTestCase(TestCase):
    def setUp(self):
        self.patcher = patch('mymodule.foo')
        self.mock_foo = self.patcher.start()

    def tearDown(self):
        self.patcher.stop()
于 2014-09-15T22:11:04.900 に答える
32

ドキュメントに従って使用している場合は、alecxeの回答に追加するだけですteardown()

を呼び出して、パッチ適用が「元に戻された」ことを確認する必要がありますstopsetUpで例外が発生した場合、 thenは呼び出されないため、これは思ったより面倒ですtearDown

テストで例外が発生した場合、パッチ適用は元に戻されません。より良い方法は、addCleanup()内部で呼び出すことsetUp()です。tearDown()その後、メソッドを完全に省略できます。

class BaseTestCase(TestCase):
    def setUp(self):
        self.patcher = patch('mymodule.foo')
        self.mock_foo = self.patcher.start()
        self.addCleanup(self.patcher.stop) # add this line
于 2015-07-28T20:21:46.457 に答える