2016-11-24 27 views
0

私のnoobの状態を許してください、しかし私は本当に理解していないと私は誰かが私のために説明することができます願っています。継承されたメソッドを模擬してください

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はすべての列の辞書と必要な変換を返します。

私がテストしているコードは、文字列内の特定の列名を持つ(Baseクラスから継承されます)をモーグリファイします。

これは、辞書から列を抽出しようとし、ラムダ関数を返しますか?または辞書に存在しない場合は、単に文字列を返すラムダを返しますか?

私がテストしようとしているコードに(値)ビットが残っているだけです。それが何をするのかは分かりません。

基礎となる変換/変換をテストしたくない場合、私のモックは単なるラムダを返すことができます。

は、だから私はそれをやったが、それは言ってmogrifyの呼び出しで例外がスローされます:

E TypeError: 'str' object is not callable

誰もが、私はここに欠けているものをいくつかの手がかりを提供することはできますか?

答えて

0

As far as I can tell, mogrifiers returns a dictionary of all the columns and any transformations that are required.

これは正しいですが、あなたがそれを示したように、それは不要なように思われるたびに新鮮な辞書を作成します。

The code I am testing calls mogrify (inherited from the Base class) with a specific column name in a string.

This tries to extract the column from the dictionary and returns the lambda function ? or if it doesn't exist in the dictionary, it returns a lambada that just gives the string back ?

はい、これも正しいです(ただし、lambadaはダンスですが、もうlambdaを意味すると思います)。呼び出し可能なを返しself.myclass.mogrify(colkey)

So that just leaves me with the (value) bit in the code I'm trying to test. It's no clear what it does.

コールは、(value)は、単純にそれを呼び出します。私はこのように書き換える場合、それは明確ことがあります

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

2行にそれを分割することも、問題が呼び出しself.myclass.mogrify(colkey)fn(value)であるかどうかをより明確になります。可能性が高いと思われる場合はfn(value)と呼んでください。それは、あなたの嘲笑したモグリフが、コールバックを返す代わりにstrを返すことを意味します。しかし、あなたは間違ったモックを持っている可能性があり、模倣されたmogrifyメソッドは実際には文字列です。

私は、あなたが示されているように書き換え、さらに2行の間にprintを挿入し、実際に返されているものを見ることをお勧めします。

関連する問題