3

djangomodels.Modelでsaveメソッド呼び出しをモックアウトしようとしています。私はモックライブラリとしてモックを使用しています。

私はapps.deps.house_factoryにあるファイルhouse_factory.pyの関数をテストしています。

house_factory.py:apps.market.modelsからインポートハウス

def create_house(location, date, price):
    house = House(id=None, date, price)
    house.save()

    # calculate some stuff and further expand the house instance
    # for example house.tag.add("some-tag")

    # save after calculations
    house.save()

Houseモデルをモックアウトしたいと思います。

class HouseModelMock(mock.Mock):
    def save(self):
        pass

テストメソッドは、unittest.TestCaseクラスの一部です。

  @patch('apps.deps.house_factory.House', new_callable=HouseModelMock)
  def create_house_test(self, MockedHouse):

      """ Constants """
      DAYS_FROM_TODAY = 55
      DATE = datetime.date.today() + datetime.timedelta(days=DAYS_FROM_TODAY)
      PRICE = 250000

    # A location is also a django module , I'm using factory_boy here for building a 'mocked' location
      location = LocationFactory.build()

      create_house(DATE, PRICE)
      MockedHouse.assert_called_with(None, DATE, PRICE)   
      MockedHouse.save.assert_called_with()

このテストを実行すると、次のようになります。

call__ return self.call(* arg、** kw)MemoryError

これは、djangoとテストで真剣に取り組む最初の試みの1つです。したがって、データベース呼び出しをモックアウトするために、設定が間違っている可能性があります。

どんな助けでもありがたいです、

ジョナス。

4

1 に答える 1

4

「これは、django とテストに真剣に取り組むための私の最初の試みの 1 つです」... を実行するたびに、Django がテスト スイートを実行するためのテスト DB を自動的に作成するため、python manage.py testデータベースの保存をモックする必要はありません。次に、DB に保存されている値をアサートします。

理想的には、デフォルトの Django のものではなく、独自のテスト (およびロジック) にパッチを適用するためにモックが使用されます。

ヒント:以下をファイルに入れるなど、単体テストにはインメモリ データベースを使用します。sqlitesettings.py

if 'test' in sys.argv:
    DATABASES['default']['ENGINE'] = 'sqlite3'

これにより、テストの実行が大幅に高速化されます。

于 2012-04-15T16:19:37.017 に答える