如何存根对象的__call__方法?

时间:2013-08-22 02:02:24

标签: python unit-testing nose fudge

我正在使用NoseFudge进行单元测试。考虑以下课程:

class Foo():    
    def __init__(self, some_commandline):
        self._some_commandline = commandline

    def process(self):
        stdout, stderr = self._commandline()
        ...

测试:

def test_process_commandline(self):
        import StringIO

        # Setup
        fake_stdout = StringIO.StringIO()
        fake_stderr = StringIO.StringIO()
        fake_stdio = fake_stdout, fake_stderr
        fake_cline = (fudge
            .Fake('SomeCommandline')
            .is_a_stub()
            .provides('__call__')
            .returns(fake_stdio))

        sut = Foo(fake_cline)

        # Exercise
        sut.process()

        # Verify
        ...

我得到的错误是:

...
    stdout, stderr = self._commandline()
TypeError: 'Fake' object is not iterable

我正在存根的代码有一个看起来像这样的返回行(“SomeCommandline”的真实版本)

return stdout_str, stderr_str

为什么我收到TypeError,说Fake不可迭代,如何使用fudge存储此方法?

1 个答案:

答案 0 :(得分:0)

应使用.is_callable()代替.provides('__call__')设置存根:

    fake_cline = (fudge
        .Fake('SomeCommandline')
        .is_callable()
        .returns(fake_stdio))

此外,此处不需要.is_a_stub(),因为我们直接删除了__call__方法,可以通过类名SomeCommandLine访问该方法。