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 回答