1

Python/Django での単体テストにモックを使用しようとしていますが、動作させることができません。モックは、呼び出されたことがないかのように動作します。

tests.py

from my_module import my_library
my_library = MagicMock()

class MyTest(TestCase):
    def test_add(self):
        acronym = 'TEST'

        m = MyModel(acronym=acronym)
        m.save()

        my_library.add.assert_called_with(acronym=acronym)

my_library.py

def add(acronym):
    # Processing...

models.py

class MyModel(Model):
    acronym = CharField(max_length=4)

    def save(self):
        my_library.add(acronym=self.acronym)

        super(MyModel, self).save(*args, **kwargs)

私のライブラリは機能します。関数 add が正しく呼び出されていることはわかっています。しかし、単体テストを実行すると例外が発生するだけなので、モックは機能していないようです。

AssertionError: Expected call: add(acronym='TEST')
Not called

私はモックを正しく使用していないと思います。誰か助けたりアドバイスをくれませんか?

4

2 に答える 2

0

これは、呼び出されないためです。プログラムの最初の行はこれを行います:

my_library = __import__("my_module")

次の行は最初の行を覆い隠しています。my_module はまったく変更されないため、他のすべてのコードはモックの代わりに元のコードを呼び出すだけです。

mock.patch代わりにご覧ください。次のようにします。

from mock import patch
import my_module as my_library

class MyTest(TestCase):
    def test_add(self):
        acronym = 'TEST'
        with patch.object(my_library, 'add') as add_method:   
            m = MyModel(acronym=acronym)
            m.save()
            add_method.assert_called_with(acronym=acronym)

または、元のモジュール名を使用します。

from mock import patch

class MyTest(TestCase):
    def test_add(self):
        acronym = 'TEST'
        with patch('my_module.add') as add_method:   
            m = MyModel(acronym=acronym)
            m.save()
            add_method.assert_called_with(acronym=acronym)
于 2013-06-03T07:11:25.503 に答える
0

使ってみてくださいpatch:

from mock import patch
from my_module import my_library


class MyTest(TestCase):
    def test_add(self):
        acronym = 'TEST'

        with patch('my_library.add') as add_method:   
            m = MyModel(acronym=acronym)
            m.save()

            add_method.assert_called_with(acronym=acronym)

それがうまくいくことを願っています。

于 2013-06-03T06:51:47.683 に答える