4

その中に他の 2 つのメソッドを呼び出すメソッドがあります。

def main_method(self, query):
  result = self.method_one(query)
  count = self.method_two(result)
  return count

def method_one(self, query):
  #Do some stuff based on results.
  #This method hits the database.
  return result

def method_two(self, result):
  #Do some stuff based on result.
  #This method also hits the database.
  return count

私は単体テストの経験があまりなく、モックとスタブを扱ったことはありません。

最初のメソッドの単体テストを作成する方法がよくわかりません。method_one と method_two はデータベースに何度もヒットし、非常にコストがかかるため、データベースにヒットする必要をなくすために mox を使用してモックまたはスタブを作成することにしました。

モックとスタブを使用した経験のある人が、私の場合にモックとスタブを使用するためのヒントを教えてくれれば、本当にありがたいです。

4

1 に答える 1

5

テストについて心配する前main_method()に、まず小さなメソッドをテストします。考えてみてくださいmethod_one()。説明のために、次のようなクラスに存在するとします。

class Foo(object):
    def method_one(self, query):
        # Big nasty query that hits the database really hard!!
        return query.all()

データベースにアクセスせずにそのメソッドをテストするには、メソッドに応答する方法を知っているオブジェクトが必要all()です。例えば:

class MockQuery(object):
    def all(self):
        return [1,2]

これでテストできます。

f = Foo()
q = MockQuery()
assert f.method_one(q) == [1,2]

これが基本的なイラストです。多くの場合、現実の世界はもっと複雑です。テストを書く手間をかける価値があるために、あなたのモックall()は定数を返すよりももっと面白いことをするでしょう。同様の方針に沿ってmethod_one()、他のロジックが多数含まれている場合は、MockQueryより複雑にする必要があります。つまり、より多くのメソッドに適切に応答できる必要があります。多くの場合、コードをテストしようとすると、元の設計が過負荷になっていることに気付きます。method_one()より小さく、より厳密に定義された、つまりよりテスト可能なパーツにリファクタリングする必要がある場合があります。

同じロジックを階層の1つ上のステップにすると、とに単純化された方法で応答する方法を知っているクラスを作成できMockFooます。method_one()method_two()

于 2011-06-03T23:47:22.173 に答える