1

Python 2.7、セロリ 3.0.24、およびモック 1.0.1 を使用します。私はこれを持っています:

class FancyTask(celery.Task):
    @classmethod
    def helper_method1(cls, name):
        """do some remote request depending on name"""
        return 'foo' + name + 'bar'

    def __call__(self, *args, **kwargs):
        funcname = self.name.split()[-1]
        bigname = self.helper_method1(funcname)
        return bigname


@celery.task(base=FancyTask)
def task1(*args, **kwargs):
    pass

@celery.task(base=FancyTask)
def task2(*args, **kwargs):
    pass

helper_method1いずれかのタスクのテスト中にパッチを適用するにはどうすればよいですか?

私は次のようなことを試しました:

 import mock
 from mymodule import tasks

 class TestTasks(unittest.TestCase):
     def test_task1(self):
         task = tasks.task1
         task.helper_method1 = mock.MagickMock(return_value='42')
         res = task.delay('blah')
         task.helper_method1.assert_called_with('blah')

そしてテストは失敗しています。元の関数は呼び出される関数です。いいえ、この質問は役に立ちませんでした。

4

1 に答える 1

1

(私はセロリのインスタンスを稼働させていないので、これをテストするのは難しいです)

アプリケーション コードのターゲット関数はクラスメソッドです。テスト コードがモックしている関数はインスタンス メソッドです。

このヘルプのようにtest_task1を変更しますか -

 def test_task1(self):
     FancyTask.helper_method1 = mock.MagickMock(return_value='42') 
     task = tasks.task1
     res = task.delay('blah')
     task.helper_method1.assert_called_with('blah')

インスタンス レベルではなくクラス レベルから呼び出されるように、おそらく assert_called_with も変更する必要があります。

変化する

     task.helper_method1.assert_called_with('blah')    

     FancyTask.helper_method1.assert_called_with('blah')
于 2013-10-29T17:48:15.173 に答える