22

初めてパッチを使用します。テスト用にクラスの 1 つにパッチを適用しようとしました。実行しようとしているパッチがないと、テスト関数の定義を通過しますが、パッチを使用すると、テスト関数の定義に明らかに別のパラメーターが必要になり、

TypeError: testAddChannelWithNamePutsChannel() takes exactly 1 argument (2 given)

エラー。テストコードは次のとおりです。

import unittest
import mock
from notification.models import Channel, addChannelWithName, deleteChannelWithName

class TestChannel(unittest.TestCase):
    @mock.patch('notification.models.Channel')
    def testAddChannelWithNamePutsChannel(self):
        addChannelWithName('channel1')
        Channel.put.assert_called_with()

パッチで追加のパラメーターが必要なのはなぜですか? また、このパラメーターは何にすべきですか? どうもありがとう!

4

2 に答える 2

57

Patch は、パッチが適用されたオブジェクトのインスタンスをテスト メソッド (クラス レベルでパッチを適用している場合はすべてのテスト メソッド) に渡します。これは、戻り値と副作用を設定したり、行われた呼び出しを確認したりできるので便利です。

from unittest.mock import patch

@patch('some_module.sys.stdout')
def test_something_with_a_patch(self, mock_sys_stdout):
    mock_sys_stdout.return_value = 'My return value from stdout'

    my_function_under_test()

    self.assertTrue(mock_sys_stdout.called)
    self.assertEqual(output, mock_sys_stdout.return_value)

文字通り何かにパッチを当てて無視したい場合は、次の呼び出しで patch を呼び出すことができます

from unittest.mock import patch, Mock

@patch('some_module.sys.stdout', Mock())
def test_something_with_a_patch(self):

をオブジェクトに置き換えsys.stdout、メソッドに渡しません。some_moduleMock

于 2013-04-17T07:03:21.457 に答える
7

patchパッチを適用したオブジェクトをテスト関数に渡します。ここに文書化されています:

関数デコレーターとしてパッチを適用し、モックを作成して装飾された関数に渡します。

>>>
>>> @patch('__main__.SomeClass')
... def function(normal_argument, mock_class):
...     print(mock_class is SomeClass)
...
>>> function(None)
True
于 2013-04-17T05:14:25.280 に答える