嘲弄继承的方法

时间:2016-11-24 01:24:04

标签: python unit-testing lambda

请原谅我的菜鸟状态,但我遇到了一个我不太懂的构造,希望有人能为我解释。

class Base(object):
    def mogrify(self, column):
        return self.mogrifiers.get(column.lower().strip()) or (lambda x: x)

...

class MyClass(some.package.Base):
    def mogrifiers(self):
        return {
            'column1': (lambda x: datetime.datetime.fromtimestamp(int(x)))
        }

...

class MyOtherClass(object):
    def convert_columns:
        ...
        new_row[colkey] = self.myclass.mogrify(colkey)(value)

这一切都有效,但我正在尝试编写单元测试并模拟MyClass

据我所知,mogrifiers返回所有列的字典和所需的任何转换。

我正在测试的代码调用 mogrify (继承自Base类),并在字符串中使用特定的列名称。

这会尝试从字典中提取列并返回lambda函数吗?或者如果它不存在于字典中,它会返回一个只返回字符串的lambda?

这样我只需要在代码I中尝试测试(value)位。它不清楚它的作用。

如果我不想测试底层的转换/转换,我的模拟就可以返回简单的lambda。

所以我已经这样做了,但它在mogrify的调用中抛出异常说:

  

E TypeError:' str'对象不可调用

任何人都能提供一些我在这里失踪的线索吗?

1 个答案:

答案 0 :(得分:1)

  

据我所知,mogrifiers返回所有的字典   列和所需的任何转换。

这是正确的,但正如你已经证明的那样,它每次都会创建一个新词典,这似乎是不必要的。

  

我正在测试的代码调用mogrify(继承自Base类)   在字符串中使用特定的列名。

     

这会尝试从字典中提取列并返回   lambda函数?或者如果它不存在于字典中,则返回   一个lambda,只是给了回来的字符串?

是的,这也是正确的(除了lambada是一种舞蹈,但我认为你的意思是lambda)。

  

这样我就可以在代码I中尝试使用(值)位   测试。它不清楚它的作用。

来电self.myclass.mogrify(colkey)会返回一个可调用的,(value)只是调用它。如果我这样重写可能会更清楚:

fn = self.myclass.mogrify(colkey)
new_row[colkey] = fn(value)

将其分成两行也可以更清楚地解决问题是调用self.myclass.mogrify(colkey)还是fn(value)。如果似乎是fn(value)调用它意味着你的模拟mogrify返回str而不是返回一个可调用的;然而,它可能是你得到了模拟错误而且模拟的mogrify方法实际上是一个字符串。

我建议你重写如图所示,并在两行之间插入print,看看实际返回的是什么。