Luigi参数默认值和模拟

时间:2015-06-23 16:11:15

标签: python unit-testing mocking luigi

我正在尝试模拟为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())行的调用之后发生。

是否有可能以这种方式模拟和修补调用的东西?

1 个答案:

答案 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())

    ...
相关问题