0

オブジェクトをインスタンス化し、そのメソッドを呼び出すクラスがUUTあります。オブジェクトは、次の 2 つ の目的でオブジェクトを使用します。 Workerdo_stuff()
WorkerProvider

  1. プロバイダー オブジェクトのメソッドを呼び出して、何らかの処理を行います。
  2. プロバイダーのイベントでメソッドをサブスクライブすることにより、プロバイダーから通知を取得します

ワーカーが通知を受け取ると、それを処理し、オブジェクトに通知します。UUTオブジェクトは、それに応じてさらにオブジェクトを作成できWorkerます。

私はすでに各クラスを単独でテストしており、UUT+Workerを一緒にテストしたいと考えています。そのために、私はモックアウトするつもりProviderです。

import mock
import unittest
import provider

class Worker():
    def __init__(self, *args):
        resource.default_resource.subscribe('on_spam', self._on_spam) # I'm going to patch 'resource.default_resource'

    def do_stuff(self):
        self.resource.do_stuff()

    def _on_spam(self, message):
        self._tell_uut_to_create_more_workers(message['num_of_new_workers_to_create'])


class UUT():
    def __init__(self, *args):
        self._workers = []

    def gen_worker_and_do_stuff(self, *args)
       worker = Worker(*args)
       self._workers.append(resource)
       worker.do_stuff()


class TestCase1(unittest.TestCase):

    @mock.patch('resource.default_resource', spec_set=resource.Resource)
    def test_1(self, mock_resource):
        uut = UUT()
        uut.gen_worker_and_do_stuff('Egg')   # <-- say I automagically grabbed the resulting Worker into self.workers
        self.workers[0]._on_spam({'num_of_new_workers_to_create':5}) # <-- I also want to get hold of the newly-created workers

(実装の詳細である) のリストにuut直接アクセスせずに、によって生成されたワーカー オブジェクトを取得する方法はありますか?_workersuut

Worker.__init__ワーカーがプロバイダー イベントにサブスクライブする でそれを実行できると思います。そのため、質問は次の
ようになりselfますresource.default_resource.subscribe('on_spam', self._on_spam)

4

1 に答える 1

-1

依存関係反転の原則の適用として、Workerクラスを依存関係として に渡しUUTます。

class UUT():
    def __init__(self, make_worker=Worker):
        self._workers = []
        self._make_worker = make_worker

    def gen_worker_and_connect(self, *args)
       worker = self._make_worker(*args)
       self._workers.append(resource)
       worker.connect()           

次に、の代わりにテストから必要なものをすべて提供しますWorker。この独自の関数は、作成されたオブジェクトをテスト スコープと共有できます。この特定の問題を解決するだけでなく、依存関係が明示的になり、UUT実装から独立したものになります。また、リソースのものもモックする必要はありません。これにより、テストは、テスト対象のクラスとは関係のないものに依存します。

于 2012-05-29T14:07:43.133 に答える