0

私はPythonが初めてなので、これが基本的なものであれば許してください。テスト対象のメソッドがあり、そのメソッドでオブジェクトをインスタンス化し、そのメソッドを呼び出し、それらが正しく呼び出されることをテストしたい (このコードは既存のものであり、単に追加しているだけであることを指摘する価値がある.既存のテストはありません)。

テスト中のメソッド

def dispatch_events(event):
    dispatcher = Dispatcher()
    dispatcher.register("TopicOne")
    dispatcher.push(event)

予想されるテスト

# Some patch here
def test_dispatch_events(self, mock_dispatcher):
    # Given
    event = { "some_prop": "some_value" }

    # When
    Class.dispatch_events(event)

    # Then
    mock_dispatcher.register.assert_called_once_with("TopicOne")
    mock_dispatcher.push.assert_called_once_with(event)

.NET のバックグラウンドから来て、私がすぐに考えたのは、パラメーターとして渡すDispatcherことです。dispatch_eventsその後、おそらく、MagicMockバージョンを渡すことができます。__init__または、 のメソッドにパッチを適用してDispatcherを返すことができるのではないかと考えましたMagicMock。これを続ける前に、a)それが可能かどうか、b)これをテストするためのベストプラクティスは何か(より良い方法を書くことがベストプラクティスである可能性があることを完全に受け入れる)を知りたかった.

4

1 に答える 1

1

議論をしてくださいdispatcher。何もパッチを当てる必要はありません。

def dispatch_events(event, dispatcher=None):
    if dispatcher is None:
        dispatcher = Dispatcher()
    dispatcher.register("TopicOne")
    dispatcher.push(event)

def test_dispatch_events(self):
    event = {"some_prop": "some_value"}
    mock_dispatcher = Mock()
    Class.dispatch_events(event, mock_dispatcher)
    mock_dispatcher.register.assert_called_once_with("TopicOne")
    mock_dispatcher.push.assert_called_once_with(event)

それができない場合、ほとんどの場合、モックする正しいものは Dispatcher.__new__またはsome.module.Dispatcherそれ自体になります。

# The exact value of 'some.module' depends on how the module that
# defines dispatch_events gets access to Dispatcher.
@mock.patch('some.module.Dispatcher')
def test_dispatch_events(self, mock_dispatcher):
    event = {"some_prop": "some_value"}
    Class.dispatch_events(event)
    mock_dispatcher.register.assert_called_once_with("TopicOne")
    mock_dispatcher.push.assert_called_once_with(event)
于 2018-03-19T17:31:46.750 に答える