6

luigi パラメータのデフォルト値を提供するものをモックしようとしています。

私が達成しようとしていることを示す愚かな例:

テスト中のタスク:

import luigi
from bar import Bar

bar = Bar()

class Baz(luigi.Task):

    qux = luigi.Parameter(default=bar.bar())

    def baz(self):
        return self.qux;

    def foo(self):
        return bar.bar()

単体テスト コード:

import unittest
from mock import Mock, patch
from sut.baz import Baz

class TestMocking(unittest.TestCase):

    def test_baz_bar(self):
        self.assertEquals("bar", Baz().baz())

    @patch('sut.baz.bar')
    def test_patched_baz(self, mock_bar):
        mock_bar.bar = Mock(return_value="foo")
        self.assertEquals("foo", (Baz().baz()))

    @patch('sut.baz.bar')
    def test_patched_foo(self, mock_bar):
        mock_bar.bar = Mock(return_value="foo")
        self.assertEquals("foo", (Baz().foo()))

luigi.Parameter ロジックは、パッチよりも前に発生しているようです。

この例では、test_patched_foo合格とtest_patched_baz不合格です。したがって、パッチは発生しますが、luigi.Parameter(default=bar.bar())回線からの呼び出しの後に発生します。

この方法で呼び出されたものをモックしてパッチを当てることは可能ですか?

4

1 に答える 1

1

qux = luigi.Parameter(default=bar.bar())行をクラスの__init__メソッドに移動してみてください。Bazの外にあると__init__、インスタンスの作成ではなく、クラス定義に設定されますが、 に入れると__init__、インスタンスが作成される時点まで作成が遅れBazます。クラス__init__でを呼び出すことを忘れないでください。super

class Baz(luigi.Task):

    def __init__(self, *args, **kwargs):
        super(Baz, self).__init__(*args, **kwargs)

        self.qux = luigi.Parameter(default=bar.bar())

    ...
于 2015-06-23T16:21:35.057 に答える