我正在尝试模拟为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())
行的调用之后发生。
是否有可能以这种方式模拟和修补调用的东西?
答案 0 :(得分: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())
...