mockを使って「関数が実行されないこと」をテストする

mockを使ってテスト書いてて、「関数が実行されたこと」をテストするのに、assert_called_withとかassert_called_once_withとかいろいろ用意されていて便利だった

で、「関数が実行されなかったこと」をテストするのはどうするのかと思って調べた。

例えばあるview関数のテストで、内部でsample_functionが呼ばれなかったことをテストするのは以下のように書けた。簡単。

# coding=utf-8
from django.test import TestCase, Client
from mock import patch


class SomeViewTest(TestCase):

    def setUp(self):
        super(SomeViewTest, self).setUp()
        self.client = Client()

    @patch('apps.views.sample_function')
    def test_some_view(self, sample_function):
        # viewを呼び出し
        self.client.get('/index')
        # sample_functionが実行されなかったことをテスト
        assert not sample_function.called

参考 : Mock - Mocking and Testing Library ― Mock 1.0.1 documentation
参考 : python - Assert a function/method was not called using Mock - Stack Overflow